2021-05-28 15:49:42 +00:00
|
|
|
<?php
|
|
|
|
/**
|
2021-05-28 16:01:42 +00:00
|
|
|
* plugins/abook_carddav/setup.php -- Main setup script
|
2021-05-28 15:49:42 +00:00
|
|
|
*
|
2021-05-28 16:01:42 +00:00
|
|
|
* SquirrelMail Address Book CardDAV Backend
|
|
|
|
* Copyright (C) 2021 Aleksei Shpakovsky
|
|
|
|
* This program is licensed under GPLv3. See COPYING for details
|
|
|
|
* based on:
|
|
|
|
* SquirrelMail Address Book Backend template
|
2021-05-28 15:49:42 +00:00
|
|
|
* Copyright (C) 2004 Tomas Kuliavas <tokul@users.sourceforge.net>
|
|
|
|
* This program is licensed under GPL. See COPYING for details
|
|
|
|
*/
|
|
|
|
|
|
|
|
// make sure SM_PATH is defined
|
|
|
|
if (!defined('SM_PATH')) {
|
|
|
|
define('SM_PATH','../../');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* init function
|
|
|
|
*/
|
2021-05-28 16:01:42 +00:00
|
|
|
function squirrelmail_plugin_init_abook_carddav() {
|
2021-05-28 15:49:42 +00:00
|
|
|
global $squirrelmail_plugin_hooks;
|
|
|
|
|
2021-05-28 16:01:42 +00:00
|
|
|
$squirrelmail_plugin_hooks['abook_init']['abook_carddav'] = 'abook_carddav_init';
|
|
|
|
$squirrelmail_plugin_hooks['abook_add_class']['abook_carddav'] = 'abook_carddav_class';
|
2021-05-30 14:18:04 +00:00
|
|
|
$squirrelmail_plugin_hooks['optpage_loadhook_display']['abook_carddav'] = 'abook_carddav_optpage';
|
|
|
|
|
2021-05-28 15:49:42 +00:00
|
|
|
}
|
|
|
|
|
2021-06-03 21:04:43 +00:00
|
|
|
function abook_get_password($data, $opt){
|
|
|
|
require_once(SM_PATH . 'functions/auth.php');
|
|
|
|
require_once(SM_PATH . 'functions/strings.php');
|
|
|
|
switch ($opt) {
|
|
|
|
case '0': return sqauth_read_password();
|
2021-06-07 22:19:28 +00:00
|
|
|
case '1': return OneTimePadDecrypt($data, base64_encode(hash("sha256",sqauth_read_password(),true)));
|
2021-06-03 21:04:43 +00:00
|
|
|
case '2': return $data;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-04 01:15:05 +00:00
|
|
|
function abook_set_password($password, $opt){
|
|
|
|
global $username, $data_dir;
|
|
|
|
switch ($opt) {
|
|
|
|
case '0': $data = ''; break;
|
|
|
|
case '1':
|
|
|
|
if(preg_match('/^\**$/', $password)) { return; }
|
|
|
|
require_once(SM_PATH . 'functions/auth.php');
|
|
|
|
require_once(SM_PATH . 'functions/strings.php');
|
2021-06-07 22:19:28 +00:00
|
|
|
$data = OneTimePadEncrypt($password, base64_encode(hash("sha256",sqauth_read_password(),true)));
|
2021-06-04 01:15:05 +00:00
|
|
|
break;
|
2021-06-07 22:14:04 +00:00
|
|
|
case '2':
|
|
|
|
if(preg_match('/^\**$/', $password)) { return; }
|
|
|
|
$data = $password;
|
|
|
|
break;
|
2021-06-04 01:15:05 +00:00
|
|
|
}
|
|
|
|
setPref($data_dir, $username, 'plugin_abook_carddav_password', $data);
|
|
|
|
}
|
|
|
|
|
2021-05-28 15:49:42 +00:00
|
|
|
/**
|
|
|
|
* Initialized address book backend
|
|
|
|
*/
|
2021-05-28 16:01:42 +00:00
|
|
|
function abook_carddav_init(&$argv) {
|
2021-05-30 14:31:07 +00:00
|
|
|
global $username, $data_dir;
|
2021-05-28 15:49:42 +00:00
|
|
|
// Get the arguments
|
|
|
|
$hookName = &$argv[0];
|
|
|
|
$abook = &$argv[1];
|
|
|
|
$r = &$argv[2];
|
|
|
|
|
2021-05-28 16:01:42 +00:00
|
|
|
bindtextdomain ('abook_carddav', SM_PATH . 'locale');
|
|
|
|
textdomain ('abook_carddav');
|
2021-05-28 15:49:42 +00:00
|
|
|
|
2021-05-30 14:18:04 +00:00
|
|
|
// TODO: consider multiple uris
|
2023-10-02 22:38:31 +00:00
|
|
|
$abook_uris = getPref($data_dir, $username, 'plugin_abook_carddav_abook_uri');
|
2021-05-30 14:18:04 +00:00
|
|
|
$abook_base_uri = getPref($data_dir, $username, 'plugin_abook_carddav_base_uri');
|
|
|
|
$abook_username = getPref($data_dir, $username, 'plugin_abook_carddav_username');
|
2021-06-03 21:04:43 +00:00
|
|
|
$abook_password_text = getPref($data_dir, $username, 'plugin_abook_carddav_password');
|
|
|
|
$abook_password_opt = getPref($data_dir, $username, 'plugin_abook_carddav_password_opt', '2');
|
|
|
|
$abook_password = abook_get_password($abook_password_text, $abook_password_opt);
|
2021-05-30 14:18:04 +00:00
|
|
|
$abook_writeable = getPref($data_dir, $username, 'plugin_abook_carddav_writeable');
|
|
|
|
$abook_listing = getPref($data_dir, $username, 'plugin_abook_carddav_listing');
|
2023-10-02 22:38:31 +00:00
|
|
|
foreach(explode(',', $abook_uris) as $abook_uri){
|
|
|
|
if(substr($abook_uri, 0,4) == 'http'){
|
|
|
|
$r=$abook->add_backend('carddav',array(
|
|
|
|
'name'=>_("CardDAV Address Book"),
|
|
|
|
'abook_uri'=>$abook_uri,
|
|
|
|
'base_uri'=>$abook_base_uri,
|
|
|
|
'username'=>$abook_username,
|
|
|
|
'password'=>$abook_password,
|
|
|
|
'writeable'=>$abook_writeable,
|
|
|
|
'listing'=>$abook_listing,
|
|
|
|
));
|
|
|
|
}
|
2021-05-30 14:18:04 +00:00
|
|
|
}
|
2021-05-28 15:49:42 +00:00
|
|
|
|
|
|
|
bindtextdomain ('squirrelmail', SM_PATH . 'locale');
|
|
|
|
textdomain ('squirrelmail');
|
|
|
|
}
|
|
|
|
|
2021-05-28 16:01:42 +00:00
|
|
|
function abook_carddav_class() {
|
2021-05-30 14:31:07 +00:00
|
|
|
global $username, $data_dir;
|
2021-05-28 16:01:42 +00:00
|
|
|
bindtextdomain ('abook_carddav', SM_PATH . 'locale');
|
|
|
|
textdomain ('abook_carddav');
|
2021-05-28 15:49:42 +00:00
|
|
|
|
2021-05-30 14:18:04 +00:00
|
|
|
// load file only if $abook_uri is set
|
|
|
|
$abook_uri = getPref($data_dir, $username, 'plugin_abook_carddav_abook_uri');
|
2021-05-30 14:31:07 +00:00
|
|
|
if(substr($abook_uri, 0,4) == 'http'){
|
2021-05-30 14:18:04 +00:00
|
|
|
require_once(SM_PATH . 'plugins/abook_carddav/abook_class.php');
|
|
|
|
}
|
2021-05-28 15:49:42 +00:00
|
|
|
|
|
|
|
bindtextdomain ('squirrelmail', SM_PATH . 'locale');
|
|
|
|
textdomain ('squirrelmail');
|
|
|
|
}
|
|
|
|
|
2021-05-30 14:18:04 +00:00
|
|
|
function abook_carddav_optpage() {
|
|
|
|
global $optpage_data;
|
|
|
|
global $username, $data_dir;
|
|
|
|
|
2021-05-30 14:40:25 +00:00
|
|
|
$abook_uri = getPref($data_dir, $username, 'plugin_abook_carddav_abook_uri');
|
|
|
|
$abook_base_uri = getPref($data_dir, $username, 'plugin_abook_carddav_base_uri');
|
|
|
|
$abook_username = getPref($data_dir, $username, 'plugin_abook_carddav_username');
|
2021-06-03 21:04:43 +00:00
|
|
|
$abook_password_opt = getPref($data_dir, $username, 'plugin_abook_carddav_password_opt', '2');
|
2021-06-07 22:14:04 +00:00
|
|
|
if($abook_password_opt == '0'){
|
|
|
|
$abook_password = '';
|
|
|
|
} else {
|
|
|
|
$abook_password = '*******';
|
2021-06-03 21:04:43 +00:00
|
|
|
}
|
2021-05-30 14:40:25 +00:00
|
|
|
$abook_writeable = getPref($data_dir, $username, 'plugin_abook_carddav_writeable');
|
|
|
|
$abook_listing = getPref($data_dir, $username, 'plugin_abook_carddav_listing');
|
2021-05-30 14:18:04 +00:00
|
|
|
sq_change_text_domain('abook_carddav');
|
|
|
|
$optpage_data['grps']['abook_carddav'] = _("CardDAV Address Book");
|
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_abook_uri',
|
2021-05-30 21:26:06 +00:00
|
|
|
'caption' => _("Addressbool URI"),
|
2021-05-30 14:18:04 +00:00
|
|
|
'type' => SMOPT_TYPE_STRING,
|
2021-05-30 21:37:25 +00:00
|
|
|
'size' => SMOPT_SIZE_HUGE,
|
2021-05-30 14:40:25 +00:00
|
|
|
'initial_value' => $abook_uri,
|
2021-05-30 14:18:04 +00:00
|
|
|
);
|
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_base_uri',
|
2021-05-30 21:26:06 +00:00
|
|
|
'caption' => _("Base URL"),
|
2021-05-30 14:18:04 +00:00
|
|
|
'type' => SMOPT_TYPE_STRING,
|
2021-05-30 14:40:25 +00:00
|
|
|
'initial_value' => $abook_base_uri,
|
2021-05-30 14:18:04 +00:00
|
|
|
);
|
2021-05-30 14:31:07 +00:00
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_dicsover_link',
|
2021-05-30 21:26:06 +00:00
|
|
|
'caption' => _("Hint"),
|
2021-05-30 14:31:07 +00:00
|
|
|
'type' => SMOPT_TYPE_COMMENT,
|
2021-05-30 21:37:25 +00:00
|
|
|
'comment' => _("Use <a href=\"../plugins/abook_carddav/discover.php\">discover</a> page to find out these values"),
|
2021-05-30 14:31:07 +00:00
|
|
|
);
|
2021-05-30 14:18:04 +00:00
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_username',
|
|
|
|
'caption' => _("Username"),
|
|
|
|
'type' => SMOPT_TYPE_STRING,
|
2021-05-30 14:40:25 +00:00
|
|
|
'initial_value' => $abook_username,
|
2021-05-30 14:18:04 +00:00
|
|
|
);
|
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_password',
|
|
|
|
'caption' => _("Password"),
|
|
|
|
'type' => SMOPT_TYPE_STRING,
|
2021-05-30 14:40:25 +00:00
|
|
|
'initial_value' => $abook_password,
|
2021-06-03 21:04:43 +00:00
|
|
|
'save' => 'plugin_abook_carddav_password_save',
|
|
|
|
);
|
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_password_opt',
|
|
|
|
'caption' => _("Password type/encryption"),
|
|
|
|
'type' => SMOPT_TYPE_STRLIST,
|
|
|
|
'posvals' => array('0' => _("Use same password for CardDAV as for IMAP (above option is ignored)"),
|
|
|
|
'1' => _("Encrypt your CardDAV password using your IMAP password"),
|
|
|
|
'2' => _("Store your CardDAV password in plaintext (least secure)")),
|
|
|
|
'initial_value' => $abook_password_opt,
|
|
|
|
'save' => 'plugin_abook_carddav_password_opt_save',
|
2021-05-30 14:18:04 +00:00
|
|
|
);
|
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_writeable',
|
2021-05-30 21:26:06 +00:00
|
|
|
'caption' => _("Writeable"),
|
2021-05-30 14:18:04 +00:00
|
|
|
'type' => SMOPT_TYPE_BOOLEAN,
|
2021-05-30 21:37:25 +00:00
|
|
|
'trailing_text' => _("(nickname field used for vcard URI)"),
|
2021-05-30 14:40:25 +00:00
|
|
|
'initial_value' => $abook_writeable,
|
2021-05-30 14:18:04 +00:00
|
|
|
);
|
|
|
|
$optpage_data['vals']['abook_carddav'][] = array(
|
|
|
|
'name' => 'plugin_abook_carddav_listing',
|
2021-05-30 21:26:06 +00:00
|
|
|
'caption' => _("Listing allowed"),
|
2021-05-30 14:18:04 +00:00
|
|
|
'type' => SMOPT_TYPE_BOOLEAN,
|
2021-05-30 21:37:25 +00:00
|
|
|
'trailing_text' => _("(otherwise, only search can be used)"),
|
2021-05-30 14:40:25 +00:00
|
|
|
'initial_value' => $abook_listing,
|
2021-05-30 14:18:04 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-06-03 21:04:43 +00:00
|
|
|
function plugin_abook_carddav_password_save($option){
|
2021-06-04 01:15:05 +00:00
|
|
|
global $username, $data_dir;
|
|
|
|
$opt = getPref($data_dir, $username, 'plugin_abook_carddav_password_opt', '2');
|
2021-06-04 09:04:43 +00:00
|
|
|
abook_set_password($option->new_value, $opt);
|
2021-06-03 21:04:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function plugin_abook_carddav_password_opt_save($option){
|
2021-06-04 01:15:05 +00:00
|
|
|
global $username, $data_dir;
|
2021-06-07 22:14:04 +00:00
|
|
|
// get current password
|
2021-06-04 01:15:05 +00:00
|
|
|
$abook_password_text = getPref($data_dir, $username, 'plugin_abook_carddav_password');
|
|
|
|
$abook_password_opt = getPref($data_dir, $username, 'plugin_abook_carddav_password_opt', '2');
|
|
|
|
$abook_password = abook_get_password($abook_password_text, $abook_password_opt);
|
2021-06-03 21:04:43 +00:00
|
|
|
save_option($option);
|
2021-06-07 22:14:04 +00:00
|
|
|
// reencrypt the password
|
2021-06-04 09:04:43 +00:00
|
|
|
abook_set_password($abook_password, $option->new_value);
|
2021-06-03 21:04:43 +00:00
|
|
|
}
|
|
|
|
|
2021-05-30 14:18:04 +00:00
|
|
|
|
2021-05-28 15:49:42 +00:00
|
|
|
/**
|
|
|
|
* shows plugin's version
|
|
|
|
* @return string
|
|
|
|
*/
|
2021-05-28 16:01:42 +00:00
|
|
|
function abook_carddav_version() {
|
2021-06-07 22:19:28 +00:00
|
|
|
return '2.0';
|
2021-05-28 15:49:42 +00:00
|
|
|
}
|
2021-05-28 16:01:42 +00:00
|
|
|
?>
|