radicale y infcloud funcionando
This commit is contained in:
+5
-10
@@ -1,14 +1,9 @@
|
||||
[base]
|
||||
[root]
|
||||
user: .+
|
||||
collection:
|
||||
permissions: R
|
||||
permissions: Rr
|
||||
|
||||
[principal]
|
||||
[owner]
|
||||
user: .+
|
||||
collection: {user}
|
||||
permissions: RW
|
||||
|
||||
[children]
|
||||
user: .+
|
||||
collection: {user}/[^/]+
|
||||
permissions: rw
|
||||
collection: {user}(/.*)?
|
||||
permissions: RWrw
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# Este archivo mantiene el directorio en Git
|
||||
# Los archivos reales de configuración están en .gitignore
|
||||
@@ -1,13 +0,0 @@
|
||||
[server]
|
||||
hosts = 0.0.0.0:5232
|
||||
|
||||
[auth]
|
||||
type = htpasswd
|
||||
htpasswd_filename = /config/users
|
||||
htpasswd_encryption = bcrypt
|
||||
|
||||
[rights]
|
||||
type = owner_only
|
||||
|
||||
[storage]
|
||||
filesystem_folder = /data/collections
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
#####################################################################################################
|
||||
# Apache configuration (REQUIRED to prevent access for .inc files /especially config files/)
|
||||
# You NEED to add the following lines into your Apache vhost configuration (without the # character):
|
||||
# <Directory /client/installation/directory/auth/>
|
||||
# AllowOverride Limit
|
||||
# <IfVersion >= 2.3>
|
||||
# Require all granted
|
||||
# </IfVersion>
|
||||
# <IfVersion < 2.3>
|
||||
# Order allow,deny
|
||||
# Allow from all
|
||||
# </IfVersion>
|
||||
# </Directory>
|
||||
#####################################################################################################
|
||||
|
||||
<Files ~ "\.inc$">
|
||||
<IfVersion >= 2.3>
|
||||
Require all granted
|
||||
</IfVersion>
|
||||
<IfVersion < 2.3>
|
||||
Order allow,deny
|
||||
Deny from all
|
||||
</IfVersion>
|
||||
</Files>
|
||||
@@ -1,41 +0,0 @@
|
||||
<?php
|
||||
function array_to_xml($array, $skip_top_closing=false, $level=0)
|
||||
{
|
||||
static $result="<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
|
||||
|
||||
foreach($array as $k => $v)
|
||||
{
|
||||
if(is_numeric($k))
|
||||
array_to_xml($v, $skip_top_closing, $level);
|
||||
else
|
||||
{
|
||||
for($j=0; $j<$level; $j++)
|
||||
$result.=" ";
|
||||
|
||||
$result.="<".htmlspecialchars($k);
|
||||
if($k=='resources')
|
||||
$result.=" xmlns=\"urn:com.inf-it:configuration\"";
|
||||
if($v=='')
|
||||
$result.=" />\n";
|
||||
else
|
||||
{
|
||||
$result.=">";
|
||||
|
||||
if(is_array($v))
|
||||
{
|
||||
$result.="\n";
|
||||
array_to_xml($v, $skip_top_closing, $level+1);
|
||||
for($j=0; $j<$level; $j++)
|
||||
$result.=" ";
|
||||
}
|
||||
else
|
||||
$result.=htmlspecialchars($v);
|
||||
|
||||
if($level!==0 || $skip_top_closing===false)
|
||||
$result.="</".htmlspecialchars($k).">\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
?>
|
||||
@@ -1,58 +0,0 @@
|
||||
<?php
|
||||
// auth method: generic (auth/plugins/generic_conf.inc) or ldap (auth/plugins/ldap_conf.inc)
|
||||
$config['auth_method']='generic';
|
||||
|
||||
// set to true for debugging XML response, otherwise set to false to avoid browser
|
||||
// to show http authentication window after unsuccessful authentication
|
||||
$config['auth_send_authenticate_header']=false;
|
||||
|
||||
// successfull authentication XML specification (change the "http://www.server.com:80" to your protocol/server/port)
|
||||
$config['accounts']=array('resources'=>array());
|
||||
|
||||
// note: if you want to use regex values, then use one of the following formats (the second example is with regex modifier): 're:.*someregex.*[0-9]$' or 're|i:.*someregex.*[0-9]$'
|
||||
// note: 'crossdomain' and 'withcredentials' are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/)
|
||||
// note: 'syncinterval' was removed - use globalSyncResourcesInterval in config.js instead
|
||||
$config['accounts']['resources'][]=array(
|
||||
'resource'=>array(
|
||||
'type'=>array('addressbook'=>'', 'calendar'=>''),
|
||||
'href'=>(empty($_SERVER['HTTPS']) ? 'http' : 'https').'://www.server.com:80/caldav.php/'.$_SERVER['PHP_AUTH_USER'].'/',
|
||||
'hreflabel'=>'null', // if undefined or empty href value is used (see above)
|
||||
'forcereadonly'=>'null', // see auth/doc/example_config_response.xml for proper use, for example: 'forcereadonly'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
|
||||
'settingsaccount'=>'true', // client properties are saved here (note: set it to true only for ONE account)
|
||||
'checkcontenttype'=>'true', // check content-type in the server response (if you cannot see data in the interface /buggy server response/ you may try to disable it)
|
||||
'delegation'=>'true', // see auth/doc/example_config_response.xml for proper use, for example: 'delegation'=>array(array('resource'=>'/caldav.php/user%40domain.com/'), array('resource'=>'re|i:^/caldav.php/a[b-x].+/$')),
|
||||
'ignorealarms'=>'false', // see auth/doc/example_config_response.xml for proper use, for example: 'ignorealarms'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
|
||||
'backgroundcalendars'=>'', // see auth/doc/example_config_response.xml for proper use, for example: 'backgroundcalendars'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re|i:^/caldav.php/user/collection[0-9]/$')),
|
||||
'userauth'=>array(
|
||||
'username'=>$_SERVER['PHP_AUTH_USER'],
|
||||
'password'=>$_SERVER['PHP_AUTH_PW']
|
||||
),
|
||||
'timeout'=>90000,
|
||||
'locktimeout'=>10000
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
// additional accounts
|
||||
$config['accounts']['resources'][]=array(
|
||||
'resource'=>array(
|
||||
'type'=>array('addressbook'=>'', 'calendar'=>''),
|
||||
'href'=>'http://www.server.com:80/caldav.php/resource/',
|
||||
'hreflabel'=>'null', // if undefined or empty href value is used (see above)
|
||||
'forcereadonly'=>'null', // see auth/doc/example_config_response.xml for proper use, for example: 'forcereadonly'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
|
||||
'settingsaccount'=>'false', // client properties are saved here (note: set it to true only for ONE account)
|
||||
'checkcontenttype'=>'true', // check content-type in the server response (if you cannot see data in the interface /buggy server response/ you may try to disable it)
|
||||
'delegation'=>'true', // see auth/doc/example_config_response.xml for proper use, for example: 'delegation'=>array(array('resource'=>'/caldav.php/user%40domain.com/'), array('resource'=>'re|i:^/caldav.php/a[b-x].+/$')),
|
||||
'ignorealarms'=>'false', // see auth/doc/example_config_response.xml for proper use, for example: 'ignorealarms'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re:^/caldav.php/user/collection[0-9]/$')),
|
||||
'backgroundcalendars'=>'', // see auth/doc/example_config_response.xml for proper use, for example: 'backgroundcalendars'=>array(array('collection'=>'/caldav.php/user/collection/'), array('collection'=>'re|i:^/caldav.php/user/collection[0-9]/$')),
|
||||
'userauth'=>array(
|
||||
'username'=>$_SERVER['PHP_AUTH_USER'],
|
||||
'password'=>$_SERVER['PHP_AUTH_PW']
|
||||
),
|
||||
'timeout'=>90000,
|
||||
'locktimeout'=>10000
|
||||
)
|
||||
);
|
||||
*/
|
||||
|
||||
?>
|
||||
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
header_remove('Access-Control-Allow-Origin');
|
||||
header_remove('Access-Control-Allow-Methods');
|
||||
header_remove('Access-Control-Allow-Headers');
|
||||
header_remove('Access-Control-Allow-Credentials');
|
||||
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('Access-Control-Allow-Methods: GET');
|
||||
header('Access-Control-Allow-Headers: User-Agent,Authorization,Content-type,X-client');
|
||||
header('Access-Control-Allow-Credentials: true');
|
||||
|
||||
if($_SERVER['REQUEST_METHOD']=='OPTIONS') // Preflighted request
|
||||
exit(0);
|
||||
?>
|
||||
@@ -1,88 +0,0 @@
|
||||
<resources xmlns="urn:com.inf-it:configuration">
|
||||
<resource>
|
||||
<type>
|
||||
<addressbook />
|
||||
<calendar />
|
||||
</type>
|
||||
<href>http://www.server.com:8080/principals/users/user/</href>
|
||||
<hreflabel></hreflabel>
|
||||
<crossdomain>null</crossdomain>
|
||||
<forcereadonly>null</forcereadonly>
|
||||
<withcredentials>false</withcredentials>
|
||||
<settingsaccount>true</settingsaccount>
|
||||
<checkcontenttype>true</checkcontenttype>
|
||||
<delegation>true</delegation>
|
||||
<ignorealarms>false</ignorealarms>
|
||||
<backgroundcalendars />
|
||||
<userauth>
|
||||
<username>user</username>
|
||||
<password>password</password>
|
||||
</userauth>
|
||||
<timeout>90000</timeout>
|
||||
<locktimeout>10000</locktimeout>
|
||||
</resource>
|
||||
<resource>
|
||||
<type>
|
||||
<addressbook />
|
||||
<calendar />
|
||||
</type>
|
||||
<href>http://www.server2.com:80/caldav.php/user/</href>
|
||||
<hreflabel></hreflabel>
|
||||
<crossdomain>null</crossdomain>
|
||||
<forcereadonly>true</forcereadonly>
|
||||
<withcredentials>false</withcredentials>
|
||||
<settingsaccount>false</settingsaccount>
|
||||
<checkcontenttype>true</checkcontenttype>
|
||||
<delegation>
|
||||
<resource>/caldav.php/user/</resource>
|
||||
<resource>/principals/users/user%40domain.com/</resource>
|
||||
<resource>re:^/caldav.php/a[b-x].+/$</resource>
|
||||
<resource>re|i:^/caldav.php/a[b-x].+/$</resource>
|
||||
</delegation>
|
||||
<ignorealarms>
|
||||
<collection>/caldav.php/user/collection/</collection>
|
||||
<collection>/caldav.php/user%40domain.com/collection/</collection>
|
||||
<collection>re:^/caldav.php/user/collection[0-9]/$</collection>
|
||||
<collection>re|i:^/caldav.php/user/collection[0-9]/$</collection>
|
||||
</ignorealarms>
|
||||
<backgroundcalendars>
|
||||
<collection>/caldav.php/user/collection/</collection>
|
||||
<collection>/caldav.php/user%40domain.com/collection/</collection>
|
||||
<collection>re:^/caldav.php/user/collection[0-9]/$</collection>
|
||||
<collection>re|i:^/caldav.php/user/collection[0-9]/$</collection>
|
||||
</backgroundcalendars>
|
||||
<userauth>
|
||||
<username>user</username>
|
||||
<password>password</password>
|
||||
</userauth>
|
||||
<timeout>90000</timeout>
|
||||
<locktimeout>10000</locktimeout>
|
||||
</resource>
|
||||
<resource>
|
||||
<type>
|
||||
<addressbook />
|
||||
<calendar />
|
||||
</type>
|
||||
<href>https://www.server3.com:8443/caldav.php/user/</href>
|
||||
<hreflabel></hreflabel>
|
||||
<crossdomain>null</crossdomain>
|
||||
<forcereadonly>
|
||||
<collection>/caldav.php/user/collection/</collection>
|
||||
<collection>/caldav.php/user%40domain.com/collection/</collection>
|
||||
<collection>re:^/caldav.php/user/collection[0-9]/$</collection>
|
||||
<collection>re|i:^/caldav.php/user/collection[0-9]/$</collection>
|
||||
</forcereadonly>
|
||||
<withcredentials>false</withcredentials>
|
||||
<settingsaccount>false</settingsaccount>
|
||||
<checkcontenttype>true</checkcontenttype>
|
||||
<delegation>false</delegation>
|
||||
<ignorealarms>false</ignorealarms>
|
||||
<backgroundcalendars />
|
||||
<userauth>
|
||||
<username>user</username>
|
||||
<password>password</password>
|
||||
</userauth>
|
||||
<timeout>90000</timeout>
|
||||
<locktimeout>10000</locktimeout>
|
||||
</resource>
|
||||
</resources>
|
||||
@@ -1,7 +0,0 @@
|
||||
1.) configure your auth method (see the plugins directory) and the response XML in auth/config.inc and set $config['auth_send_authenticate_header']=true
|
||||
2.) configure the selected auth module in plugins/PLUGIN_conf.inc
|
||||
3.) check the correct response by visiting http://your-server.com/client_dir/auth/ and entering username and password
|
||||
4.) set $config['auth_send_authenticate_header']=false in auth/config.inc
|
||||
|
||||
By default the generic plugin is used for basic HTTP authentication ($config['auth_method']='generic'; in config.inc).
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
require_once('config.inc');
|
||||
require_once('common.inc');
|
||||
require_once('cross_domain.inc');
|
||||
require_once('plugins/'.$config['auth_method'].'.inc'); // configured module - it defines the 'MODULE_authenticate()' function
|
||||
|
||||
if(call_user_func($config['auth_method'].'_authenticate')!==1)
|
||||
{
|
||||
// HTTP authentication (exit if unsuccessfull)
|
||||
if($config['auth_send_authenticate_header'])
|
||||
header('WWW-Authenticate: Basic realm="Inf-IT Auth Module"');
|
||||
header('HTTP/1.0 401 Unauthorized');
|
||||
echo <<<HTML
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>401 Authorization Required</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Authorization Required</h1>
|
||||
<p>This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p>
|
||||
</body>
|
||||
</html>
|
||||
HTML;
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
header('Content-type: text/xml; charset="utf-8"');
|
||||
header('Cache-Control: max-age=0, must-revalidate, no-cache, no-store, no-transform, private');
|
||||
echo array_to_xml($config['accounts']);
|
||||
}
|
||||
?>
|
||||
@@ -1,58 +0,0 @@
|
||||
<?php
|
||||
require_once(dirname(__FILE__).'/generic_conf.inc');
|
||||
|
||||
function generic_authenticate()
|
||||
{
|
||||
global $pluginconfig;
|
||||
if($_SERVER['PHP_AUTH_USER']!='' && $_SERVER['PHP_AUTH_PW']!='')
|
||||
{
|
||||
preg_match('#(https?)://([^/:]+)((?::[0-9]+)?)#i', $pluginconfig['base_url'], $matches);
|
||||
$hostname_clean=$matches[2];
|
||||
if($matches[1]=='https')
|
||||
$hostname='ssl://'.$matches[2];
|
||||
else
|
||||
$hostname=$matches[2];
|
||||
|
||||
if($matches[3]=='')
|
||||
{
|
||||
if($matches[1]=='http')
|
||||
$port=80;
|
||||
else if($matches[1]=='https')
|
||||
$port=443;
|
||||
}
|
||||
else
|
||||
$port=substr($matches[3],1);
|
||||
|
||||
$fp=fsockopen($hostname, $port, $errno, $errstr, $pluginconfig['timeout']);
|
||||
if(!$fp)
|
||||
{
|
||||
echo "$errstr ($errno)<br />\n";
|
||||
return -2;
|
||||
}
|
||||
else
|
||||
{
|
||||
$request="<?xml version=\"1.0\" encoding=\"utf-8\"?><A:propfind xmlns:A=\"DAV:\"><A:prop><A:current-user-principal/></A:prop></A:propfind>";
|
||||
|
||||
$out="PROPFIND ".$pluginconfig['request']." HTTP/1.1\r\n";
|
||||
$out.="Host: $hostname_clean\r\n";
|
||||
$out.="Authorization: Basic ".base64_encode($_SERVER['PHP_AUTH_USER'].':'.$_SERVER['PHP_AUTH_PW'])."\r\n";
|
||||
$out.="Depth: 0\r\n";
|
||||
$out.="Content-Type: text/xml; charset=\"utf-8\"\r\n";
|
||||
$out.="Content-Length:". strlen($request)."\r\n\r\n";
|
||||
$out.=$request;
|
||||
fwrite($fp, $out);
|
||||
|
||||
$result='';
|
||||
if(!feof($fp))
|
||||
$result.=fgets($fp);
|
||||
fclose($fp);
|
||||
|
||||
if(strpos($result, 'HTTP/1.1 207')===0)
|
||||
return 1; // auth successful
|
||||
else
|
||||
return -1; // auth unsuccessful
|
||||
}
|
||||
}
|
||||
return 0; // empty username or password
|
||||
}
|
||||
?>
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
// Server base URL
|
||||
$pluginconfig['base_url']=(empty($_SERVER['HTTPS']) ? 'http' : 'https').'://my.server.com:8080';
|
||||
|
||||
// Default values are usually OK
|
||||
// for Davical:
|
||||
$pluginconfig['request']='/caldav.php'; // change only if your Davical is not installed into server root directory
|
||||
// for Lion server:
|
||||
//$pluginconfig['request']='/principals/users';
|
||||
|
||||
$pluginconfig['timeout']=30;
|
||||
?>
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
require_once(dirname(__FILE__).'/ldap_conf.inc');
|
||||
|
||||
function ldap_authenticate()
|
||||
{
|
||||
global $pluginconfig;
|
||||
if($_SERVER['PHP_AUTH_USER']!="" && $_SERVER['PHP_AUTH_PW']!="")
|
||||
{
|
||||
$ds=ldap_connect($pluginconfig['host']);
|
||||
|
||||
// if binding is required for LDAP search
|
||||
if(isset($pluginconfig['bind_dn']) && isset($pluginconfig['bind_passwd']))
|
||||
{
|
||||
@ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
|
||||
if(!($r=@ldap_bind($ds, $pluginconfig['bind_dn'], $pluginconfig['bind_passwd'])))
|
||||
return -2; // auth unsuccessful (bind error)
|
||||
}
|
||||
|
||||
// perform the search
|
||||
if(($r=ldap_search($ds, $pluginconfig['basedn'], '(&('.$pluginconfig['user_attr'].'='.$_SERVER['PHP_AUTH_USER'].')'.(isset($pluginconfig['filter']) && $pluginconfig['filter']!='' ? '('.$pluginconfig['filter'].')' : '' ).')'))!==false)
|
||||
{
|
||||
$result=@ldap_get_entries($ds, $r);
|
||||
if($result[0])
|
||||
{
|
||||
@ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
|
||||
if(@ldap_bind($ds, $result[0]['dn'], $_SERVER['PHP_AUTH_PW']))
|
||||
{
|
||||
@ldap_unbind($bi);
|
||||
return 1; // auth successful
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1; // auth unsuccessful
|
||||
}
|
||||
return 0; // empty username or password
|
||||
}
|
||||
?>
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
// LDAP configuration parameters
|
||||
$pluginconfig['host']='ldaps://ldap.server.com/';
|
||||
$pluginconfig['basedn']='ou=People,dc=server,dc=com';
|
||||
$pluginconfig['user_attr']='uid';
|
||||
// if the server requires binding (if set to null then binding is not performed)
|
||||
//$pluginconfig['bind_dn']=null;
|
||||
//$pluginconfig['bind_passwd']=null;
|
||||
|
||||
// optional
|
||||
$pluginconfig['filter']='accountStatus=active';
|
||||
?>
|
||||
@@ -43,7 +43,9 @@ window.applicationCache.addEventListener('updateready', function(){
|
||||
// Check if a new cache is available on page load.
|
||||
window.addEventListener('load', function(e)
|
||||
{
|
||||
window.applicationCache.addEventListener('cached', function(e)
|
||||
// Check if applicationCache is supported (deprecated in modern browsers)
|
||||
if (window.applicationCache) {
|
||||
window.applicationCache.addEventListener('cached', function(e)
|
||||
{
|
||||
if(!isUserLogged)
|
||||
window.location.reload();
|
||||
@@ -76,4 +78,8 @@ window.addEventListener('load', function(e)
|
||||
//$('#LoginPage .window').css('display', 'inline-block');
|
||||
}
|
||||
}, false);
|
||||
} else {
|
||||
// Application cache not supported, continue without cache functionality
|
||||
console.log('Application cache not supported in this browser');
|
||||
}
|
||||
}, false);
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
#! /bin/bash
|
||||
# Use this script every time you modify any file to force browsers to reload it (empty HTML5 cache).
|
||||
|
||||
command -v ed &> /dev/null || { echo "Error: 'ed' not installed. Aborting." > /dev/stderr; exit 1; }
|
||||
printf ",s/#V.*/#V $(date '+%Y%m%d%H%M%S')/\nw\nq\n" | ed -s cache.manifest
|
||||
@@ -1,17 +0,0 @@
|
||||
InfCloud Changelog
|
||||
|
||||
version 0.13.1 [2015-09-22]:
|
||||
- includes CalDavZAP 0.13.1 (see changelog_caldavzap.txt)
|
||||
- includes CardDavMATE 0.13.1 (see changelog_carddavmate.txt)
|
||||
|
||||
version 0.13.0 [2015-09-16]:
|
||||
- includes CalDavZAP 0.13.0 (see changelog_caldavzap.txt)
|
||||
- includes CardDavMATE 0.13.0 (see changelog_carddavmate.txt)
|
||||
|
||||
version 0.12.1 [2015-03-16]:
|
||||
- includes CalDavZAP 0.12.1 (see changelog_caldavzap.txt)
|
||||
- includes CardDavMATE 0.12.1 (see changelog_carddavmate.txt)
|
||||
|
||||
version 0.12.0 [2015-01-26]:
|
||||
- includes CalDavZAP 0.12.0 (see changelog_caldavzap.txt)
|
||||
- includes CardDavMATE 0.12.0 (see changelog_carddavmate.txt)
|
||||
@@ -1,294 +0,0 @@
|
||||
CalDavZAP Changelog
|
||||
|
||||
|
||||
NOTE: if you are interested in integrated version of CalDavZAP and CardDavMATE (our CardDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/
|
||||
|
||||
version 0.13.1 [2015-09-22]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore
|
||||
|
||||
version 0.13.0 [2015-09-16]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: if you use a server with cross-domain setup see the modified Access-Control-Allow-Headers and Access-Control-Expose-Headers in readme.txt (or misc/config_davical.txt or misc/calendarserver.diff); you MUST update these headers, otherwise the client will NOT work
|
||||
- configuration - added globalEnableRefresh option which enables/disables the new "refresh all resources" icon in the left application menu (disabled by default)
|
||||
- added Chinese localization (zh_CN) - thanks Fandy
|
||||
- added shift+login shortcut to ignore settings stored on the server and use the default settings (this functionality was added long time ago, but I forgot to mention about it)
|
||||
- added support for "Prefer: return=representation" (and related "Preference-Applied: return=representation") for PUT requests (see http://tools.ietf.org/html/rfc7240); this change REQUIRES update of Access-Control-Allow-Headers and Access-Control-Expose-Headers if cross-domain setup is used
|
||||
- added full RFC2445 support - RRULE processing is now performed by rrule.js (see: https://github.com/jakubroztocil/rrule); thanks to this library we now support/expand all recurrences, although the most exotic ones are "read-only" (for these you will see "Other (modification not supported)" in the interface)
|
||||
- added DESCRIPTION property for VALARM components to make them RFC compliant
|
||||
- added check for unsupported XML 1.0 characters in user entered data - these are replaced by a space character (to prevent client and/or server side parsing errors)
|
||||
- added title with version number for the software name/description (login screen)
|
||||
- added vCalendar line folding (RFC2445 - section 4.1)
|
||||
- fixed event processing when multiple VEVENT and VTIMEZONE components are intermingled
|
||||
- fixed VTODO COMPLETED property (UTC time format)
|
||||
- fixed alarm window not being localized properly
|
||||
- fixed an occasional issue where all collections are double loaded on login
|
||||
- changed version checking - use internal build number for software version comparison to support update notification also for beta and rc builds
|
||||
- changed format and comments in config.js
|
||||
- changed storing of user settings (PROPPATCH request) - no server request will be made if there is no change in settings
|
||||
- updated jQuery to 2.1.4
|
||||
- updated localizations - thanks Niels Bo Andersen [da_DK], Marten Gajda [de_DE], Damian Vila [es_ES], Gabriela Vattier [fr_FR], Luca Ferrario [it_IT], Muimu Nakayama [ja_JP], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Serge Yakimchuck [uk_UA]
|
||||
- updated timezone.js to latest IANA timezone database
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.12.1 [2015-03-16]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: you NEED to enable "mod_headers" in Apache (for other servers see your server documentation) which is used to generate proper HTTP headers (required for correct support of HTML5 cache in browsers); the previously used mod_expire is not longer used (see the changelog entry below)
|
||||
- added support for absolute collection URLs returned in PROPFIND request
|
||||
- fixed HTML5 cache related problems (especially in Firefox) by returning "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header instead of "Cache-Control: max-age=0" - this fix requires enabled "mod_headers" (you can disable the previously used "mod_expires") in Apache - for more details see .htaccess
|
||||
- fixed processing of the language parameter in the title of event/todo
|
||||
- changed displaying of event/todo calendar list in event/todo form - now it is possible to create new event/todo also into inactive event/todo collection
|
||||
- updated jQuery-UI to 1.11.4
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.12.0 [2015-01-26]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- configuration - added globalDefaultEventDuration configuration variable - set the default duration (in minutes) for newly created events
|
||||
- added widened todo list with dynamic number of columns
|
||||
- added checkboxes for todos in the todo list - now you can change the status of a todo by clicking on its checkbox
|
||||
- added duplicate button for copying of events/todos
|
||||
- fixed loading of future/past todos - now the loading of additional future/past todos is performed also by clicking on datepicker calendar (in the todo list view)
|
||||
- updated jQuery to 2.1.3
|
||||
- updated jQuery-UI to 1.11.2
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.11.1 [2014-10-07]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- updated timezone.js to latest IANA timezone database
|
||||
- updated jQuery to 2.1.1
|
||||
- updated jQuery-UI to 1.11.1
|
||||
- fixed calendar color change functionality
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.11.0 [2014-10-02]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: this release contains new, changed and also removed configuration options (always use the latest config.js)
|
||||
- configuration - removed showHeader option from globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - it is incompatible with new functionality
|
||||
- configuration - added globalCrossServerSettingsURL configuration option - enable this option if your CalDavZAP installation is accessible from multiple URLs (URL1, URL2), otherwise settings (such as enabled/active collections) stored from the URL1 will be incompatible with settings stored from URL2
|
||||
- configuration - added globalCalendarColorPropertyXmlns configuration option - used to define the namespace for calendar-color property (see below)
|
||||
- configuration - changed default value for delegation option to true (in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings)
|
||||
- configuration - changed default value for globalEventStartPastLimit and globalEventStartFutureLimit from 2 to 3
|
||||
- added Japan localization (ja_JP) - thanks Muimu Nakayama
|
||||
- added support for loading and unloading of user collections and delegated collections (delegation functionality)
|
||||
- added support for calendar color change (write support for calendar-color property)
|
||||
- added arrow icons for agenda views to indicate out of view events
|
||||
- added currently logged user into the page title
|
||||
- added hover element for calendar events
|
||||
- updated localizations - thanks Michael Rasmussen [da_DK], Marten Gajda [de_DE], Damián Vila [es_ES], Jean-Christophe Bach [fr_FR], Luca Ferrario [it_IT], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Yevgen Martsenyuk [uk_UA]
|
||||
- fixed occasional wrong UID processing when moving events/todos between different calendar collections
|
||||
- fixed issues with subscribed calendars
|
||||
- fixed processing of alarms
|
||||
- fixed an occasional parseDate bug due to daylight saving time in specific timezones
|
||||
- various fixes, optimalizations, improvements, visual updates and more
|
||||
|
||||
version 0.10.0.5 [2014-04-14]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- updated Russian localization (ru_RU)
|
||||
- fixed wrong processing of RECURRENCE-ID property in UTC (Z) timezone
|
||||
- fixed occasional wrong processing of repeating events generated in future
|
||||
|
||||
version 0.10.0.4 [2014-03-15]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- added Russian localization (ru_RU) - thanks Александр Симонов
|
||||
- fixed synchronization of removed events for servers without sync-collection report support
|
||||
- minor translation fixes
|
||||
|
||||
version 0.10.0.3 [2014-03-12]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- added support for LDAP binding in auth/ldap module (see auth/plugins/ldap_conf.inc)
|
||||
- fixed occasional wrong processing of DTEND attribute
|
||||
- fixed incorrect creation of recurring events which caused that multiple different UIDs can be present in one calendar object (edit + save of previously created events will split them into multiple objects)
|
||||
|
||||
version 0.10.0.2 [2014-02-17]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- added Ukrainian localization (uk_UA) - thanks Serge Yakimchuck
|
||||
- added misc/readme_baikal_sabredav.txt and misc/baikal-flat-0.2.7.diff to solve issues related to storing CalDavZAP properties on SabreDAV and Baïkal - thanks Johannes Zellner
|
||||
- fixed invalid XML response processing (SabreDAV and Baïkal)
|
||||
- fixed invalid XML request if globalEventStartPastLimit and globalEventStartFutureLimit are set to null
|
||||
- fixed "delegation" XML processing
|
||||
- updated French [fr_FR] localization - thanks Jean-Christophe Bach
|
||||
|
||||
version 0.10.0.1 [2014-02-04]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- added Spanish localization (es_ES) - thanks Damián Vila
|
||||
- updated jQuery to 2.1.0
|
||||
- updated jQuery-UI to 1.10.4
|
||||
- changed various default date formats
|
||||
- changed alarm behaviour - it is no longer possible to create multiple identical alarms (they are automatically merged into one)
|
||||
- fixed a visual bug when displaying a simple todo alert
|
||||
- fixed rare issue where UNTIL attribute of recurrent events was not processed correctly
|
||||
|
||||
version 0.10.0 [2014-01-22]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: this release contains new, changed and also removed configuration options (always use the latest config.js)
|
||||
- configuration - added globalEventStartPastLimit and globalEventStartFutureLimit for time-range filtering - note: for servers without time-range filtering support you need to set both variables to null (see config.js)
|
||||
- configuration - replaced globalInactiveCollections and globalInactiveTodoCollections by globalActiveCalendarCollections and globalActiveTodoCollections (see config.js)
|
||||
- configuration - removed globalResourceHeaderShowLogin option - it is replaced by much more flexible hrefLabel option in globalAccountSettings and globalNetworkCheckSettings (see config.js)
|
||||
- configuration - removed syncInterval option from globalAccountSettings and globalNetworkCheckSettings - detection of sync-token changes is now performed by ONE request instead of N (number of collections) - use globalSyncResourcesInterval instead
|
||||
- configuration - removed crossDomain and withCredentials options from default globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - both settings are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/)
|
||||
- major improvements and changes in sychronization code - MUCH reduced number of HTTP request to server
|
||||
- major design changes (including the open source Roboto font)
|
||||
- major readme.txt update with detailed descriptions of most common setup problems
|
||||
- added support for time-range filtering (requires server with time-range filtering support) - EXTREME performance improvements
|
||||
- added workaround for buggy HTML5 cache handling in the latest Firefox
|
||||
- added "equivalency" for todo filters (globalAppleRemindersMode) - NEEDS-ACTION, IN-PROGRESS and CANCELLED are processed as NEEDS-ACTION
|
||||
- added calendar color indicator for event/todo forms (unified with the upcoming CardDavMATE)
|
||||
- added handling of unsupported settings
|
||||
- added support for 'headervalue' collection property (namespace: http://inf-it.com/ns/dav/) - useful for collection grouping
|
||||
- added new overlay with refresh button, when cache manifest change is detected (it forces users to reload the page)
|
||||
- added support/mapping for alternative timezone names - e.g. 'US/Pacific' (legacy name) is mapped to 'America/Los_Angeles' (current name)
|
||||
- changed resource list design (unified with the upcoming CardDavMATE)
|
||||
- changed todo processing if globalAppleRemindersMode is enabled - todos with start and no end are processed as simple todos
|
||||
- changed displaying of repeating todo confirm question
|
||||
- changed time-range filtering for todos - all todos from future are loaded from server initially
|
||||
- updated French [fr_FR] localization - thanks Jean-Christophe Bach
|
||||
- optimized window resizing functionality
|
||||
- fixed local timezone processing
|
||||
- fixed loader hanging after login if subscribed calendar list is empty
|
||||
- fixed generating of repeating events in future
|
||||
- fixed RRULE processing if specified in YYYYMMDD format
|
||||
- fixed displaying of arrows for repeating events
|
||||
- fixed sorting of resources
|
||||
- fixed various search issues
|
||||
- disabled opening of new event/todo form if only read-only collections are present
|
||||
- removed jQuery source mapping file reference
|
||||
- LOT of other improvements and fixes
|
||||
|
||||
version 0.9.1.2 [2013-08-05]:
|
||||
- fixed processing of recurrent events (special recurrences - correct BYMONTHDAY processing)
|
||||
- fixed globalTimeFormatBasic configuration option processing (it is no longer ignored)
|
||||
- removed old and unused configuration options (globalDefaultDisplayTodo and globalTodoHideExpired)
|
||||
|
||||
version 0.9.1.1 [2013-07-30]:
|
||||
- fixed processing of recurrent events with until date
|
||||
- fixed saving of until dates values in recurrent events
|
||||
- fixed parsing of double quoted TZID param values
|
||||
|
||||
version 0.9.1 [2013-07-26]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: this release contains changed configuration options (always use the latest config.js)
|
||||
- configuration - changed globalAppleRemindersMode option values - newly supported values are iOS6, iOS7, true (it is set to latest supported iOS - in this case iOS7) and false (see config.js)
|
||||
- added Turkish localization (tr_TR) - thanks Selcuk Pultar
|
||||
- updated localizations - thanks Michael Rasmussen [da_DK], Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL]
|
||||
- added additional automatic fixes for invalid events
|
||||
- added support for STATUS attribute
|
||||
- added support for CALSCALE attribute (only GREGORIAN is supported; missing attribute = GREGORIAN)
|
||||
- added automatic change of "time to" after "time from" change (preserve the event/todo duration)
|
||||
- added support for dynamic height of NOTE field - thanks http://www.jacklmoore.com/autosize/
|
||||
- fixed problem with always visible completed todos when globalAppleRemindersMode enabled
|
||||
- fixed window resize callback
|
||||
- fixed incorrect detection of privileges for binded resources
|
||||
- fixed processing of RECURRENCE-ID in events/todos
|
||||
- fixed parsing of todo/event components with same UID in subscribed calendars
|
||||
- fixed parsing of due date timezone
|
||||
- fixed processing of DURATION value for allday events
|
||||
- fixed problem with multiple URL and LOCATION attributes
|
||||
- fixed handling of VERSION attribute
|
||||
- fixed repeating todo and event processing
|
||||
- fixed timezone picker problems
|
||||
- updated jQuery to 2.0.3
|
||||
- changed default "due date" for todos to date selected in the todo calendar
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.9.0 [2013-06-27]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (added Access-Control-Expose-Headers header)
|
||||
- note: if you use OS X Calendarserver it is recommended to re-patch your installation (added Access-Control-Expose-Headers header; see misc/readme_osx.txt)
|
||||
- note: this release contains new and also changed configuration options (always use the latest config.js)
|
||||
- configuration - added globalSettingsType option - set the destination for client settings on server (useful if your server not allows to store properties to "principal-URL" but allows to store them to "calendar-home-set")
|
||||
- configuration - added checkContentType option into globalAccountSettings and globalNetworkCheckSettings - enables content-type checking for server response (only objects with proper content-type are inserted into interface) - if you cannot see data in the interface you may try to disable it
|
||||
- configuration - added globalAppleRemindersMode option (enabled by default) - it enables workarounds for Apple clients (see config.js)
|
||||
- configuration - added globalIgnoreCompletedAlarms option (enabled by default) - it disables alarm for completed todos (see config.js)
|
||||
- MAJOR performance improvements
|
||||
- added support for Cyrus server - thanks Ken Murchison
|
||||
- added support for additional CalDAV servers (should work with the same servers as CardDavMATE)
|
||||
- added completely new and shiny interface for todos
|
||||
- added support for additional todo properties and repeating todos
|
||||
- added support for PRODID property for both events and todos
|
||||
- added new custom formats for time and day strings based on currently selected localization
|
||||
- added Hungarian localization (hu_HU)
|
||||
- changed cache.manifest - cache all image files in HTML5 cache
|
||||
- changed ordering of calendars in selectbox (globalSortAlphabet is used)
|
||||
- changed internal logic of resource loading, synchronization and version check functionality (to prepare for integration with CardDavMATE)
|
||||
- changed minimum height of events to height of "30 minutes" event
|
||||
- fixed Firefox placeholder colors
|
||||
- fixed and updated various localization strings
|
||||
- fixed events and todos sometimes being editable even with forceReadOnly flag enabled
|
||||
- fixed various timezone processing issues
|
||||
- fixed visual event form bug when using repeat option with weekend/business days
|
||||
- fixed current time indicator error during day/week transition
|
||||
- fixed timezone picker (at the bottom of the resource list) - it is no longer editable using keyboard navigation while editing event/todo
|
||||
- fixed wrong ajax parameter which may cause warnings in server log
|
||||
- fixed an issue when timezone picker was not always visible after login
|
||||
- updated left menu with new icons (thanks Kelecsenyi Timotej - http://timotejos.com/)
|
||||
- updated jQuery to 2.0.2 (and related fixes)
|
||||
- updated jQuery-UI to 1.10.3 (and related fixes)
|
||||
- updated auth module to reflect the latest changes in configuration options
|
||||
- updated misc directory (it is the same as in CardDavMATE)
|
||||
- updated localizations - thanks Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL] (note: Danish [da_DK] localization contains some untranslated strings)
|
||||
- LOT of other improvements and fixes
|
||||
|
||||
version 0.8.1.1 [2013-02-25]:
|
||||
- fixed multiple bugs related to processing of recurrent events
|
||||
- fixed forced lower case problem of some strings in the interface
|
||||
- other minor fixes
|
||||
|
||||
version 0.8.1 [2013-02-21]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache)
|
||||
- added support for background calendars in day view event list
|
||||
- added missing misc directory
|
||||
- fixed syntax error if configured using globalAccountSettings
|
||||
- fixed issues with delegation proccessing if multiple accounts are configured
|
||||
- fixed issue with pinned tab in Firefox (manual reloading is not required anymore)
|
||||
- fixed privileges for binded calendars - these are now strictly read only
|
||||
- fixed wrong proccessing of number of occurrences for recurrent events
|
||||
- fixed issue where readonly events could still be edited via drag and drop and resizing
|
||||
- fixed and optimized the "Revert" button functionality
|
||||
- fixed issue with saving empty URL property
|
||||
- fixed incorrect alarm box position
|
||||
- fixed bad positioning of error image for "repeat end" date field
|
||||
|
||||
version 0.8.0 [2013-02-13]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache)
|
||||
- note: this release contains new configuration option (always use the latest config.js)
|
||||
- configuration - added globalUseJqueryAuth option - use jQuery .ajax() auth or custom header for HTTP basic auth (default); set this option to true if your server uses digest auth (note: you may experience auth popups on some browsers)
|
||||
- configuration - added globalRemoveUnknownTimezone (disabled by default) - it removes non-standard/unknown timezones if event/todo is edited (and saved)
|
||||
- configuration - added delegation option into globalAccountSettings and globalNetworkCheckSettings (sets additional delegated resources - if true then delegation is enabled for all available resources; if false (default) then delegation is disabled; if an array of URL encoded resources or regexes (for example: ['/caldav.php/user/', '/caldav.php/user%40domain.com/', new RegExp('^/caldav.php/a[b-x].+/$', 'i')] then delegation is enabled for all specified resources
|
||||
- configuration - added ignoreAlarms option into globalAccountSettings and globalNetworkCheckSettings (defines an array calendars with disabled alarm - if true then all alarms are ignored; if false (default) then alarms are enabled; if an array of URL encoded collections or regexes (for example: ['/caldav.php/user/collection/', '/caldav.php/user%40domain.com/collection/', new RegExp('^/caldav.php/user/collection[0-9]/$', 'i')] then alarm is disabled for all specified resources
|
||||
- configuration - added backgroundCalendars option into globalAccountSettings and globalNetworkCheckSettings - defines an array of background calendars - if there is at least one event defined for the given day in a background calendar, the background color for that day will be pink/light-red; to use this feature define an array of URL encoded collections or regexes (for example: ['/caldav.php/user/collection/', '/caldav.php/user%40domain.com/collection/', new RegExp('^/caldav.php/user/collection[0-9]/$', 'i')])
|
||||
- configuration - added user defined time format support for events via globalTimeFormatBasic and globalTimeFormatAgenda variables (see config.js)
|
||||
- configuration - changed forceReadonly property proccessing - URL encoded collections and also regexes are now supported (see config.js)
|
||||
- configuration - changed globalCalendarSelected variable proccessing - full UID (for example: http://username@domain.com:8080/caldav.php/user/calendar/) and also UID matching regexes are now supported (see config.js)
|
||||
- configuration - date and time formats are now predefined for each localization - if you want to use custom date and time formats instead of predefined formats (defined by localizations) use globalAMPMFormat and globalDatepickerFormat variables (commented out by default)
|
||||
- added Danish localization (da_DK) - thanks Niels Bo Andersen
|
||||
- added German localization (de_DE) - thanks Marten Gajda and Thomas Scheel
|
||||
- added Italian localization (it_IT) - thanks Luca Ferrario
|
||||
- added French localization (fr_FR) - thanks John Fischer
|
||||
- added Dutch localization (nl_NL) - thanks Johan Vromans
|
||||
- added additional functionality for today button - now it scrolls the calendar to ensure that the today slot is visible in the top of the view
|
||||
- added support for fallback to PROPFIND if REPORT is not supported and server returns incorrect 403 error code (instead of 400 or 501)
|
||||
- added support for events without DTEND or DURATION values
|
||||
- added support for DURATION property
|
||||
- added support for CLASS property (Privacy)
|
||||
- added support for TRANSP property (Availability)
|
||||
- added support for URL property
|
||||
- updated timezone.js to latest IANA timezone database
|
||||
- updated auth module to reflect the latest changes in configuration options
|
||||
- changed button label from "All future events" to "This and all future events" for more clarity
|
||||
- changed the "repeat end" option text from "after" to "occurences" for more clarity (event ends after X occurences, including the first one)
|
||||
- changed event listing in day view - now it scrolls to the very top if the currently displayed day is the first day of month (the button for loading the previous month is now visible)
|
||||
- changed event listing in day view - now it scrolls to the closest following day if the currently displayed day is not found (no events exist for that day)
|
||||
- fixed login => logout => relogin as different user bug
|
||||
- fixed "Unable to save" bug when creating/editing an event/todo
|
||||
- fixed cache_update.sh - replaced sed by ed due to cross OS compatibility problems
|
||||
- fixed duplicate scrollbar problem in week and day views
|
||||
- fixed useless revert button - it is no longer visible when creating a new event or todo
|
||||
- fixed position of the error image in todo completed field
|
||||
- fixed processing of UNTIL values in repeating events
|
||||
- fixed EXDATE value processing and saving
|
||||
- fixed January specific bug
|
||||
- fixed BYMONTH value processing - anniversaries
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.7.0 [2012-11-20]:
|
||||
- initial public release
|
||||
@@ -1,503 +0,0 @@
|
||||
CardDavMATE Changelog
|
||||
|
||||
|
||||
NOTE: if you are interested in integrated version of CardDavMATE and CalDavZAP (our CalDAV web client) please use InfCloud - http://www.inf-it.com/open-source/clients/infcloud/
|
||||
|
||||
version 0.13.1 [2015-09-22]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- changed login screen autocomplete behaviour - we do not prevent browsers from remembering login/password anymore
|
||||
- fixed a bug related to vCard PHOTO attribute processing (and the related "The contact on the server was changed and reloaded!" message)
|
||||
|
||||
version 0.13.0 [2015-09-16]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: if you use a server with cross-domain setup see the modified Access-Control-Allow-Headers and Access-Control-Expose-Headers in readme.txt (or misc/config_davical.txt or misc/calendarserver.diff); you MUST update these headers, otherwise the client will NOT work
|
||||
- configuration - added globalEnableRefresh option which enables/disables the new "refresh all resources" icon in the left application menu (disabled by default)
|
||||
- configuration - added globalCollectionDisplay, globalCollectionSort and globalContactDataMinVisiblePercentage - these options allow to configure our new fully customizable wide contact list (see config.js)
|
||||
- added Chinese localization (zh_CN) - thanks Fandy
|
||||
- added shift+login shortcut to ignore settings stored on the server and use the default settings (this functionality was added long time ago, but I forgot to mention about it)
|
||||
- added support for "Prefer: return=representation" (and related "Preference-Applied: return=representation") for PUT requests (see http://tools.ietf.org/html/rfc7240); this change REQUIRES update of Access-Control-Allow-Headers and Access-Control-Expose-Headers if cross-domain setup is used
|
||||
- added support for automatically expanding fields in the editor (e.g. if you enter a phone number, another phone number field is automatically expanded)
|
||||
- added support for multiple street components in a single address field (additional fields are automatically expanded)
|
||||
- added an option to specify a remote URL as photo source - use shift+click on a photo box to add an URL
|
||||
- added check for unsupported XML 1.0 characters in user entered data - these are replaced by a space character (to prevent client and/or server side parsing errors)
|
||||
- added title with version number for the software name/description (login screen)
|
||||
- fixed vCard line folding (RFC2426 - section 2.6)
|
||||
- changed version checking - use internal build number for software version comparison to support update notification also for beta and rc builds
|
||||
- changed initialy enabled collections behaviour - if there are no enabled collections during the login, enable all available collections owned by the logged user
|
||||
- changed format and comments in config.js
|
||||
- changed storing of user settings (PROPPATCH request) - no server request will be made if there is no change in settings
|
||||
- updated jQuery to 2.1.4
|
||||
- updated localizations - thanks Niels Bo Andersen [da_DK], Marten Gajda [de_DE], Damian Vila [es_ES], Gabriela Vattier [fr_FR], Luca Ferrario [it_IT], Muimu Nakayama [ja_JP], Johan Vromans [nl_NL], Selcuk Pultar [tr_TR], Александр Симонов [ru_RU], Serge Yakimchuck [uk_UA]
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.12.1 [2015-03-16]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: you NEED to enable "mod_headers" in Apache (for other servers see your server documentation) which is used to generate proper HTTP headers (required for correct support of HTML5 cache in browsers); the previously used mod_expire is not longer used (see the changelog entry below)
|
||||
- added support for absolute collection URLs returned in PROPFIND request
|
||||
- fixed HTML5 cache related problems (especially in Firefox) by returning "Cache-Control: max-age=0, must-revalidate, no-cache, no-transform, private" header instead of "Cache-Control: max-age=0" - this fix requires enabled "mod_headers" (you can disable the previously used "mod_expires") in Apache - for more details see .htaccess
|
||||
- updated jQuery-UI to 1.11.4
|
||||
- other improvements and fixes
|
||||
|
||||
version 0.12.0 [2015-01-26]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: this release contains new, changed and also removed configuration options (always use the latest config.js)
|
||||
- configuration - removed showHeader option from globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - it is incompatible with new functionality
|
||||
- configuration - removed globalResourceHeaderShowLogin option - it is replaced by much more flexible hrefLabel option in globalAccountSettings and globalNetworkCheckSettings (see config.js)
|
||||
- configuration - removed syncInterval option from globalAccountSettings and globalNetworkCheckSettings - detection of sync-token changes is now performed by ONE request instead of N (number of collections) - use globalSyncResourcesInterval instead
|
||||
- configuration - removed crossDomain and withCredentials options from default globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings - both settings are still available but there is NO REASON to use them (crossDomain is detected automatically, and I've never seen anyone who understand when to use withCredentials /there is NO REASON to set it to true!/)
|
||||
- configuration - added globalGroupContactsByCompanies configuration option - used to group contacts by company/department name instead of simple alphabetical sort (default false)
|
||||
- configuration - added globalCrossServerSettingsURL configuration option - enable this option if your CardDavMATE installation is accessible from multiple URLs (URL1, URL2), otherwise settings (such as enabled/active collections) stored from the URL1 will be incompatible with settings stored from URL2
|
||||
- configuration - added globalAddrColorPropertyXmlns configuration option - used to define the namespace for addressbook-color property (see below)
|
||||
- configuration - changed default value for delegation option to true (in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings)
|
||||
- added Spanish localization (es_ES) - thanks Damián Vila
|
||||
- added Japan localization (ja_JP) - thanks Muimu Nakayama
|
||||
- added Russian localization (ru_RU) - thanks Александр Симонов
|
||||
- added Ukrainian localization (uk_UA) - thanks Serge Yakimchuck
|
||||
- MAJOR functionality and design changes (including the open source Roboto font)
|
||||
- MAJOR performacne improvements
|
||||
- major improvements and changes in the sychronization code
|
||||
- major readme.txt update with detailed descriptions of most common setup problems
|
||||
- added support for loading and unloading of user collections and delegated collections (delegation functionality)
|
||||
- added addressbook color functionality (we hope you will like the new approach :-))
|
||||
- added automatic photo resize functionality (no more photo size limit - we simply resize it in the browser)
|
||||
- added support for generic (Apple-like) date attributes (instead of fixed BDAY and ANNIVERSARY)
|
||||
- added support for 'headervalue' collection property (namespace: http://inf-it.com/ns/dav/) - useful for collection grouping
|
||||
- added new overlay with refresh button which is shown when cache manifest change is detected (it forces users to reload the page)
|
||||
- added support for LDAP binding in auth/ldap module (see auth/plugins/ldap_conf.inc)
|
||||
- added currently logged user into the page title
|
||||
- added misc/readme_baikal_sabredav.txt and misc/baikal-flat-0.2.7.diff to solve issues related to storing CardDavMATE (and also CalDavZAP) properties on SabreDAV and Baïkal - thanks Johannes Zellner
|
||||
- removed globalSearchAutoCleanup configuration option (it is no longer required)
|
||||
- updated auth module to reflect the latest changes in configuration options
|
||||
- updated jQuery to 2.1.3
|
||||
- updated jQuery-UI to 1.11.2
|
||||
- various fixes, optimalizations, improvements, visual updates and more
|
||||
|
||||
version 0.11.1 [2013-07-26]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- added support for dynamic height of NOTE field - thanks http://www.jacklmoore.com/autosize/
|
||||
- added Turkish localization (tr_TR) - thanks Selcuk Pultar
|
||||
- updated Danish [da_DK] localization - thanks Michael Rasmussen
|
||||
- updated jQuery to 2.0.3
|
||||
- fixed incorrect detection of privileges for binded resources
|
||||
|
||||
version 0.11.0 [2013-06-27]:
|
||||
- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (added Access-Control-Expose-Headers header)
|
||||
- note: if you use OS X Calendarserver it is recommended to re-patch your installation (added Access-Control-Expose-Headers header; see misc/readme_osx.txt)
|
||||
- note: this release contains new and also changed configuration options (always use the latest config.js)
|
||||
- configuration - globalCollectionSort, globalCollectionDisplay and globalContactStoreFN - removed equivalents for last (surname, lastname, family), middle (middlename) and first (firstname, given) for faster regex processing
|
||||
- configuration - added globalSettingsType option - set the destination for client settings on server (useful if your server not allows to store properties to "principal-URL" but allows to store them to "addressbook-home-set")
|
||||
- configuration - added checkContentType option into globalAccountSettings and globalNetworkCheckSettings - enables content-type checking for server response (only objects with proper content-type are inserted into interface) - if you cannot see data in the interface you may try to disable it
|
||||
- EXTREME performance improvements (especially for large collections)
|
||||
- added support for image editing by clicking to the image (it opens a file chooser)
|
||||
- added functionality to remember the latest selected addressbook (stored as DAV property on the server)
|
||||
- added support for html5 cache (fixes minor bugs when used offline after initial login)
|
||||
- added support for Cyrus server - thanks Ken Murchison
|
||||
- changed loading of collections - all collections are loaded immediately after login (required for future features)
|
||||
- changed XML requests (adds support for more servers)
|
||||
- changed LOCK support detection - it is detected using PROPFIND request instead of DAV header
|
||||
- fixed Firefox placeholder colors
|
||||
- fixed problem with PHOTO attribute - "PHOTO;BASE64:" is obsolete but now it is supported
|
||||
- fixed problem with removing categories using backspace if the editor is in "show" mode
|
||||
- fixed problem with duplicate IM values if vCards are edited by Android (or other) devices/editors
|
||||
- improved vCard processing performance (MAJOR improvements especially for large vCards with PHOTO)
|
||||
- improved processing of the PHOTO attribute value
|
||||
- updated jQuery to 2.0.2 (and related fixes)
|
||||
- updated jQuery-UI to 1.10.3 (and related fixes)
|
||||
- updated auth module to reflect the latest changes in configuration options
|
||||
- updated placeholder plugin to support the current version of jQuery (replaced .live(...) with .on(...))
|
||||
- updated localizations - thanks Marten Gajda [de_DE], John Fischer [fr_FR], Luca Ferrario [it_IT] and Johan Vromans [nl_NL] (note: Danish [da_DK] localization contains some untranslated strings)
|
||||
- updated misc/readme_osx.txt for OS X 10.8 (instructions to add CORS headers into Calendarserver used by OS X)
|
||||
- renamed misc/calendarserver_CardDavMATE.diff to misc/calendarserver.diff (the patch works also for CalDavZAP)
|
||||
- renamed misc/readme_lion.txt to misc/readme_osx.txt
|
||||
- LOT of other improvements and fixes
|
||||
|
||||
version 0.10.1 [2013-02-21]:
|
||||
- note: this release contains new configuration option (always use the latest config.js)
|
||||
- configuration - added globalUseJqueryAuth option - use jQuery .ajax() auth or custom header for HTTP basic auth (default); set this option to true if your server uses digest auth such as Baïkal (note: you may experience auth popups on some browsers)
|
||||
- configuration - added delegation option into globalAccountSettings and globalNetworkCheckSettings (sets additional delegated resources - if true then delegation is enabled for all available resources; if false (default) then delegation is disabled; if an array of URL encoded resources or regexes (for example: ['/caldav.php/user/', '/caldav.php/user%40domain.com/', new RegExp('^/caldav.php/a[b-x].+/$', 'i')] then delegation is enabled for all specified resources
|
||||
- configuration - changed forceReadonly property proccessing - URL encoded collections and also regexes are now supported (see config.js)
|
||||
- configuration - date format is now predefined for each localization - if you want to use custom date format instead of predefined format (defined by localizations) use globalDatepickerFormat variable (commented out by default)
|
||||
- added support for fallback to PROPFIND if REPORT is not supported and server returns incorrect 403 error code (instead of 400 or 501)
|
||||
- added support for SOGO (it required only two minor bugfixes)
|
||||
- added title text for "Logout" and "Add Contact" buttons
|
||||
- fixed minor CSS problems (missing animations and icons during the drag&drop operations)
|
||||
- updated auth module to reflect the latest changes in configuration options
|
||||
|
||||
version 0.10.0 [2012-12-19]:
|
||||
- note: this release contains new and also changed configuration options (always use the latest config.js)
|
||||
- configuration - added globalSearchAutocleanup (disabled by default) - it allows to enable automatic search filter cleanup on collection (not vCard group) change
|
||||
- configuration - changed globalDatepickerFormat default value from 'yy-mm-dd' to 'dd.mm.yy'
|
||||
- added write support for PHOTO attribute (frequently requested) - just drag your photo into the photo box - note: only photos with size up to 64KiB (65536 B) are accepted, bigger photos are silently ignored ("best" size for your photo: 164 x 183 px)
|
||||
- added Dutch localization (nl_NL) - thanks Johan Vromans
|
||||
- fixed major version checking bug
|
||||
- fixed invalid template usage for unsupported parameters
|
||||
- fixed X-ABLabel attribute matching (now it is case insensitive)
|
||||
- fixed country switching (if a user switches to different country after he entered the address fields, these are preserved)
|
||||
- fixed invalid addressbook list content if collection is changed with non-empty search filter and enabled globalSearchAutocleanup (note: it was enabled by default in previous versions)
|
||||
- fixed "undefined" text in addressbook list if N attribute value not uses full format
|
||||
- fixed "Error: 'unable to save': correct the highlighted invalid values!" error message (related to custom labels)
|
||||
- fixed country ordering for non-en_US localizations
|
||||
- fixed problem with editor image dimensions (if a vCard contains PHOTO)
|
||||
- fixed datepicker "Uncaught Unexpected literal at position" warning in the console log
|
||||
- fixed "add contact" button state when the editor is in "edit" mode
|
||||
- fixed translation of "Resources" string
|
||||
- fixed minor bugs in SVG images
|
||||
- improved search support - search is now possible by N [surname, firstname, middle name, prefix, suffix], NICKNAME, ORG, EMAIL and TEL attribute values (for TEL search use only numbers without spaces or other characters /leading '+' is supported/)
|
||||
- improved support for custom attribute types - if the custom value is already defined also as a standard value, then the standard value is used
|
||||
- improved parsing of very "exotic" vCards
|
||||
- updated jQuery to 1.8.3 (it fixes IE cross domain problems)
|
||||
- updated jQuery-UI to 1.9.1 (and related fixes)
|
||||
|
||||
version 0.9.9 [2012-11-06]:
|
||||
- note: replaced custom headers in .htaccess by mod_expires options (you need to set "AllowOverride FileInfo Limit Indexes" for CardDavMATE directory and enable mod_expires in Apache /you can disable the previously used mod_headers/) - the client will also work without the .htaccess but browsers can/will cache the javascript files what can cause problems when you update your installation
|
||||
- note: this release contains new configuration options (always use the latest config.js)
|
||||
- configuration - added globalCollectionDisplayOrg (enabled by default) - it allows to choose which attribute value is used for "company contacts" (ORG or N/FN)
|
||||
- configuration - added globalDatepickerFirstDayOfWeek (default 1 => Monday) - it allows to set the first day of week for datepicker (see config.js)
|
||||
- configuration - added globalUriHandlerProfile - it allows to set profile URLs for X-SOCIALPROFILE (see config.js)
|
||||
- configuration - updated default globalNetworkCheckSettings and globalNetworkAccountSettings - fixed bug if you use full URL (with "/index.html" included)
|
||||
- added write support for custom labels (frequently requested)
|
||||
- added support for X-PHONETIC-FIRST-NAME and X-PHONETIC-LAST-NAME attributes (used by Apple clients)
|
||||
- added support for X-SOCIALPROFILE attribute (used by Apple clients)
|
||||
- added IE 10 support
|
||||
- design changes and MAJOR cross OS/browser CSS fixes
|
||||
- new login screen logo
|
||||
- rearrangement of options for "Related" attribute (more frequently used options are moved to top)
|
||||
- changed editor width - vCard editor is now wider (frequently requested)
|
||||
- disallow to drag a contact into contact group if the contact is already a member of that group
|
||||
- fixed parsing of very exotic vCards with "/" character in param values
|
||||
- fixed GUI bugs related to contact group drag&drop operations
|
||||
- fixed suggestion width for Categories
|
||||
- fixed Firefox "AddCategory" placeholder color (Firefox bug?)
|
||||
- LOT of other improvements and fixes (sorry, I am too lazy to write changelog entry for all changes :-))
|
||||
|
||||
version 0.9.8 [2012-10-04]:
|
||||
- note: this release contains new and also changed configuration options (always use the latest config.js)
|
||||
- configuration - changed globalCollectionSort, globalCollectionDisplay and globalContactStoreFN options - string values are replaced by more flexible array values (see config.js)
|
||||
- configuration - added globalBackgroundSync (enabled by default) - support for synchronisation if browser window/tab is not focused (see config.js)
|
||||
- configuration - added globalResourceAlphabetSorting (enabled by default) - support for user defined resource (server account) sorting instead of forced alphabetical sorting /applicable only if more than one resource is configured/ (see config.js)
|
||||
- configuration - added forceReadOnly option into globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings (sets the resource or list of collections as "read-only" - if true then the whole resource will be marked as "read-only"; if an array of collections /for example: ['collection1','collection2']/ then collections in the list will be marked as "read-only"; if null /default/, unset or unknown then real server detected privileges are used)
|
||||
- configuration - added new globalNetworkAccountSettings example (by default it refers to CURRENT_URL/auth/ subdirectory)
|
||||
- added support for simultaneously loaded collections (when switching to a different collection the previous collection is not unloaded - if you want back the previous behaviour use "var globalForceUnloadPrevCollection=true;" in config.js)
|
||||
- added support for remembering of the currently selected contact when switching to a different collection/contact group (when switching back, this contact is re-selected)
|
||||
- added support for automatic scrollbar move when a collection/contact group is clicked to ensure that the contact is visible in the interface
|
||||
- added support for folding long lines in newly created vCards (RFC2426 - section 2.6)
|
||||
- added support for detection of DAV compliance classes (don't try to LOCK the collection if there is no LOCK support /class 2/)
|
||||
- added support for content type checking (only 'text/vcard' and 'text/x-vcard' are accepted)
|
||||
- changed auth module XML configuration format and related changes (see misc/example_config_response.xml and auth/config.inc)
|
||||
- changed company contacts displayvalue to ORG attribute value (if present, otherwise N or FN is used)
|
||||
- changed vCard UID generation (no "-CardDavMATE" suffix in newly generated UIDs)
|
||||
- improved collection and addressbook insert sort - O(n*log(n)) /major performance improvement especially for large collections/
|
||||
- improved suggestion sorting for company, department and categories (globalSortAlphabet is used)
|
||||
- fixed possible missing contact groups in the interface if more than one adressbook contains contact groups
|
||||
- fixed possible wrong header position if non-null hrefLabel is used with non-empty additionalResources
|
||||
- fixed login screen language switching bug after unsuccessful authentication
|
||||
- fixed sortkey comparison if a compared character is not present in globalSortAlphabet
|
||||
- fixed header removal when deleting contacts from addressbooks
|
||||
- fixed error if globalAddressCountryFavorites is undefined
|
||||
- fixed incorrect scrollbar position for keyboard navigation functionality
|
||||
- fixed undefined variable problem with empty company name and non-empty department
|
||||
- fixed crossDomain value for the software update check
|
||||
- fixed image resizing bug when contacts are switched too quickly using keyboard navigation
|
||||
- fixed minor iOS bugs in CSS
|
||||
- other improvements, fixes and internal code reorganisation
|
||||
- workaround for displaying of images created with Evolution ("X-EVOLUTION-UNKNOWN" image type)
|
||||
- workaround for undefined image type in PHOTO attribute
|
||||
- changed "reset search button" cursor to pointer
|
||||
- moved all CSS files into css/ directory and related changes
|
||||
- updated readme.txt with up to date instructions
|
||||
- updated CSS files for integration with the upcoming CalDAV web client
|
||||
- updated jQuery to 1.8.2
|
||||
- updated jQuery-UI to 1.8.23
|
||||
|
||||
version 0.9.7.1 [2012-06-19]:
|
||||
- support for RFC 6578 final (proper synchronization of deleted contacts with Davical 1.1.0)
|
||||
|
||||
version 0.9.7 [2012-05-29]:
|
||||
- note: this release contains new configuration options (always use the latest config.js)
|
||||
- configuration - added globalEditorFadeAnimation - support for custom fade in/out animation speed (see config.js)
|
||||
- configuration - added globalInterfaceCustomLanguages option - it allows to limit/reorder the interface languages shown in the login screen
|
||||
- configuration - added hrefLabel option into globalAccountSettings and globalNetworkCheckSettings - support for custom server name in the resource header instead of the full href value (see config.js)
|
||||
- configuration - added globalEnableKbNavigation option - it allows to enable/disable the keyboard navigation functionality [key up/key down] in the contact list (see config.js and the changelog below)
|
||||
- configuration - changed default value for globalSyncResourcesInterval to 300000 miliseconds (resource list changes are rare)
|
||||
- configuration - changed default syncInterval from 30000 to 60000 miliseconds
|
||||
- configuration - updated globalSortAlphabet and globalSearchTransformAlphabet
|
||||
- major internal code cleanup - all ajax operations (even subsequent) are now async => better performance, fixed Firefox 11+ unable to delete contact and unable to perform drag&drop operations
|
||||
- major internal code cleanup - number of requests to the server is minimized => better performance, better bandwidth usage
|
||||
- improved performance of adding new elements in vCard editor by ~40%
|
||||
- added keyboard navigation functionality for contact switching by pressing [key up/key down] (enabled by default)
|
||||
- added support to search by ORG and EMAIL attribute values
|
||||
- added text suggestion for company (from current collection) and department (from current collection but only for the current company) fields in vCard editor
|
||||
- added French localization (fr_FR) - thanks John Fischer
|
||||
- fixed lost sync-token during resource sync (every globalSyncResourcesInterval miliseconds) => result: MUCH less bandwidth usage!
|
||||
- fixed possible missing contacts in the interface if network error occurs during the addressbook-multiget REPORT (after the successful sync-collection REPORT)
|
||||
- fixed vCard value escaping - colon is not escaped anymore (ambiguity of the vCard 3.0 standard)
|
||||
- fixed country selectbox lost focus if the country is changed by keyboard
|
||||
- fixed editor remains in the "edit" mode after the "save" operation if newly created contact is hidden due to active search filter
|
||||
- fixed contact list "header" hiding in vCard group with active search filter
|
||||
- fixed set next contact as active when removing contact from vCard group (previously always the first contact was set as active)
|
||||
- fixed "add contact" button state - now it is inactive during a collection loading
|
||||
- fixed compatibility with future versions of jQuery
|
||||
- moved logout button to the resource list header (to match the position in the upcoming CalDav web client)
|
||||
- updated .htaccess to support image caching and output compression using mod_deflate
|
||||
- updated jQuery-UI to 1.8.20
|
||||
|
||||
version 0.9.6 [2012-04-25]:
|
||||
- note: if you use DAViCal with cross-domain setup see the modified Apache configuration in misc/config_davical.txt (solved problem with CardDAV-Sync from Marten Gajda)
|
||||
- note: if you use MacOS X Lion calendarserver it is recommended to re-patch your installation (see misc/readme_lion.txt and the changelog below)
|
||||
- configuration - changed default syncInterval from 15000 to 30000
|
||||
- added support for automatic detection of crossDomain option in globalAccountSettings, globalNetworkCheckSettings and globalNetworkAccountSettings (if not set to boolean true/false it is automatically detected; default is null - autodetect)
|
||||
- added IE9+ support (non cross-domain setup only /IE9 & jQuery limitation/; minor graphics glitches due to missing CSS support for "disabled" html elements)
|
||||
- added support for prefix and suffix (vCard N attribute)
|
||||
- added Czech localization (cs_CZ)
|
||||
- added Danish localization (da_DK) - thanks Niels Bo Andersen
|
||||
- fixed search with upper case letters not present in globalSearchTransformAlphabet
|
||||
- fixed parsing of double quoted vCard param values (who use this?)
|
||||
- fixed Andorra address fields
|
||||
- fixed minor graphics glitch with update notification after logout and new login
|
||||
- updated auth module to support multiple resources in response + updated auth/config.inc with modified templates
|
||||
- updated misc/config_davical.txt (better handling of preflighted OPTION requests)
|
||||
- updated misc/calendarserver_CardDavMATE.diff (support for cross-domain queries with X-Requested-With header /upcoming Safari 5.2/)
|
||||
- updated default globalSearchTransformAlphabet in config.js
|
||||
- updated CSS detection rule for iPad (new screen resolution for iPad 3)
|
||||
- updated jQuery to 1.7.2
|
||||
- updated jQuery-UI to 1.8.19
|
||||
- replaced .attr('value'[, ...]) with .val([...])
|
||||
- many other fixes
|
||||
|
||||
version 0.9.5 [2012-03-12]:
|
||||
- note: this release contains new configuration option (always use the latest config.js)
|
||||
- configuration - added globalSearchTransformAlphabet setting - used for transformation of non-ASCII characters to ASCII (for search support)
|
||||
- added search support (search is performed on the addressbook values in the interface + category names)
|
||||
- added language selector to login screen (use globalInterfaceLanguage to set the preselected language)
|
||||
- added Hungarian localization (hu_HU)
|
||||
- scrollable resource list (only if needed)
|
||||
- minor bug fixes
|
||||
|
||||
version 0.9.4 [2012-02-29]:
|
||||
- fixed vCard parameter parsing (TYPE=X,Y now works correctly again)
|
||||
- fixed date parsing for BDAY and X-ANNIVERSARY attributes (dates with missing '-' caused non-RFC vCard error)
|
||||
- correct "\n" unescaping in vCard values if the previous character is '\'
|
||||
- updated phone parameter definitions (iOS5 uses "TYPE=voice" in addition of other types)
|
||||
- correct header removing from addressbook if contact is removed
|
||||
- changed default value for undefined phone type from "main" to "cell" ("main" is Apple specific)
|
||||
- added "TYPE=internet" into EMAIL parameters if it is missing (better non-RFC vCard compatibility)
|
||||
- added "fax" phone type (in addition of "home fax" and "work fax")
|
||||
- use of .prop() instead of .attr() to set 'readonly', 'disabled', 'selected', 'checked' and 'src' properties
|
||||
- minor fixes for Slovak and German (thanks Thomas Scheel) localizations
|
||||
- other minor fixes
|
||||
|
||||
version 0.9.3 [2012-02-17]:
|
||||
- added German localization (de_DE) - thanks Marten Gajda
|
||||
- fixed invalid switch to PROPFIND if REPORT/sync-collection is unsupported (+ related bugfixes)
|
||||
- changed DOM operations to fix Firefox only bugs with 0.9.2 (Firefox or jQuery bug?)
|
||||
- fixed "active editor -> logout -> login" problem (inactive resource/addressbook list)
|
||||
|
||||
version 0.9.2 [2012-02-13]:
|
||||
- security fix: correct globalAccountSettings cleanup after logout
|
||||
- note: this release contains new configuration options (always use the latest config.js)
|
||||
- configuration - increased default timeout value for configuration account templates from 10 to 30 seconds
|
||||
- configuration - changed default configuration for Davical - works also if Davical is installed into subdirectory (instead of domain root directory)
|
||||
- configuration - added globalContactStoreFN option - support for custom FN formatting instead of fixed 'prefix,last,middle,first,suffix' (see config.js)
|
||||
- configuration - added globalCompatibility option - customizations for 3rd party clients
|
||||
- configuration - globalCompatibility: added anniversaryOutputFormat option - supported values: 'apple' (default) and 'other' (see config.js)
|
||||
- configuration - added globalInterfaceLanguage option (see config.js and the changelog below)
|
||||
- added localization support (new localizations are welcome!)
|
||||
- added English localization (en_US)
|
||||
- added Slovak localization (sk_SK)
|
||||
- added Italian localization (it_IT) - thanks Luca Ferrario
|
||||
- added support for Oracle, SabreDav and probably many other CardDav servers
|
||||
- added support for CATEGORIES attribute with auto-suggest for categories in active collection (category separator: Enter)
|
||||
- 100% performance improvement for PUT requests (add/edit/move/... operations) - get the modified Etag from PUT response header instead of additional REPORT requests (if the server support this feature, otherwise get the modified vCard with new Etag from the server)
|
||||
- notable performance improvements for DOM operations (contact loading and manipulation)
|
||||
- correct '\' character escaping in vCard values
|
||||
- removed write support for X-EVOLUTION-* attributes (caused many problems and Evolution already support the X-* attributes without "-EVOLUTION" prefix)
|
||||
- many other fixes
|
||||
|
||||
version 0.9.1 [2012-01-29]:
|
||||
- note: this release contains new configuration options (always use the latest config.js)
|
||||
- configuration - added lockTimeOut option into globalAccountSettings and globalNetworkCheckSettings - this option is used by the LOCK method and sets the lock timeout for the resource (default: 10000 miliseconds)
|
||||
- configuration - new globalDatepickerFormat option - datepicker date format setting (see config.js)
|
||||
- added support for BDAY attribute
|
||||
- added support for X-ANNIVERSARY, X-EVOLUTION-ANNIVERSARY and X-ABDATE (with "anniversary flag") attributes
|
||||
- added support for multiple URL attributes with params (many clients use this approach in vCard 3.0 even if params are not RFC compliant)
|
||||
- contact images are displayed with correct aspect ratio
|
||||
- CSS fixes (login page padding problem, icon positioning problem for data handler icons in Firefox and many Windows only Firefox fixes)
|
||||
- major performance improvement for country/address format switching
|
||||
- added "Note: your browser is unsupported!" message to login screen for IE and Opera
|
||||
- increased default timeOut values in config.js to 10000 (reported problems with slow/overloaded servers)
|
||||
- updated jQuery-UI to 1.8.17
|
||||
- "add contact" and edit operations automatically set focus on "Firstname" in the editor
|
||||
- click on the active contact is ignored (there is no reason to reload it into editor)
|
||||
- renamed account-uid to data-account-uid (HTML5 compliance)
|
||||
- added missing alt attributes in index.html (HTML5 compliance)
|
||||
- removed "meta http-equiv" from index.html (HTML5 compliance)
|
||||
- updated readme.txt
|
||||
|
||||
version 0.9.0 [2012-01-10]:
|
||||
- note: if you use DAViCal with cross-domain setup you need to update your apache configuration (see misc/config_davical.txt)
|
||||
- note: if you use MacOS X Lion calendarserver you need to re-patch your installation (see misc/readme_lion.txt and the changelog below)
|
||||
- added support for drag&drop contact move operation (not available if the source or destination collection is read-only)
|
||||
- added support for "Delete from Group" (available if an Apple contact group is loaded)
|
||||
- added support for drag&drop add contact to contact group (available for active resource and its contact groups)
|
||||
- major internal cleanup and bugfixes
|
||||
- fixed auth module/generic plugin HTTP request used for authentication
|
||||
- minor iOS related and other CSS fixes
|
||||
|
||||
version 0.8.3 [2011-12-25]:
|
||||
- configuration: new globalAddressCountryFavorites option - favorite countries at the top of the country list in the editor
|
||||
- increase of RegExp performance by ~70% (use of pre-built regular expressions)
|
||||
- additional major performance improvements (especially for large collections) by using late vCard processing (the slowest vCard transformations are performed first time when the contact is loaded into the editor)
|
||||
- added read/write backward compatibility support for the following non-standard vCard attributes: X-ASSISTANT, X-EVOLUTION-ASSISTANT, X-MANAGER, X-EVOLUTION-MANAGER, X-SPOUSE, X-EVOLUTION-SPOUSE
|
||||
- added "home mobile" and "work mobile" options for PHONE attribute
|
||||
- the loading animation (spinning ball) now disappears only after the entire collection is loaded and inserted into DOM
|
||||
- fixed the "The contact on the server was changed and reloaded!" message error caused by wrong vCard comparison
|
||||
- the collection list key value for empty string is defined as '#'
|
||||
- major CSS cleanup and cross browser CSS fixes
|
||||
- new login screen :-)
|
||||
|
||||
version 0.8.2 [2011-12-15]:
|
||||
- configuration: new globalAddressCountryEquivalence option - support for regex based country detection in ADR attribute (see config.js)
|
||||
- added absolute URL support to resource search
|
||||
- added PRODID attribute support
|
||||
- added support for non-RFC vCards with missing N and/or FN attributes (SOGo Connector bug related to company vCards)
|
||||
- added automatic transformation for non-RFC TEL, EMAIL and URL attributes (Evolution bugs)
|
||||
- CSS tweaks (no select boxes if the editor is not in "edit" mode) and fixes
|
||||
- X-* IM attributes are ignored only if there is an IMPP attribute with the same value
|
||||
- the collection list key value for most common non-alphabet characters is defined as '#'
|
||||
|
||||
version 0.8.1 [2011-12-10]:
|
||||
- minor svg icon fixes
|
||||
- better non-RFC vCard compatibility (now it is possible to delete contacts without UID attribute)
|
||||
- fixed problems with the N attribute if not all parts of the value are defined
|
||||
- fixed problems with the X-* IM attributes if no parameters defined for the attribute
|
||||
|
||||
version 0.8.0 [2011-12-05]:
|
||||
- new vector graphics (replaced png icons with svg icons)
|
||||
- added support for MiddleName (vCard N attribute) with possibility to use "middle" in globalCollectionSort and globalCollectionDisplay configuration options
|
||||
- changed default values for globalCollectionSort and globalCollectionDisplay to "last,middle,first"
|
||||
- added support for Department (vCard ORG attribute)
|
||||
- added support for NickName (vCard NICKNAME attribute)
|
||||
- added support for JobTitle (vCard TITLE attribute)
|
||||
- added support for URL (vCard URL attribute)
|
||||
- added URI handler for TEL attributes - the default handler is tel: (see config.js)
|
||||
- added URI handler for EMAIL attributes - the default handler is mailto: (see config.js)
|
||||
- added URI handler for URL attribute - if no handler defined in the URL value the default handler is http:// (see config.js)
|
||||
- added update notification (see config.js)
|
||||
- removed Opera support (there are too many issues with Opera CSS support, SVG, missing CORS, ...)
|
||||
- update jQuery to version 1.7.1 (minimized version)
|
||||
- currently unused regexes in vcard_rfc_regex.js are commented out (minor performance improvement)
|
||||
- CSS fixes and tweaks
|
||||
- fixed undefined variable problem with non-RFC N attribute in Apple vCard groups
|
||||
- clicking to the active collection not reloads it from the server (there is no reason if it is already loaded)
|
||||
- switching back from vCard group to the collection not reloads the collection from the server (there is no reason if it is already loaded)
|
||||
- if there is no valid photo in the vCard, checking/unchecking the "Company Contact" changes the default picture in the editor (note: CardDavMATE default pictures are not saved to the server)
|
||||
- fixed several bugs by disallowing to click to resource or contact when editing another contact (fade in/out animation on resource and collection list)
|
||||
|
||||
version 0.7.3 [2011-11-17]:
|
||||
- note: this release contains new configuration options (always use the latest config.js)
|
||||
- configuration: new globalCollectionSort and globalCollectionDisplay options (see config.js)
|
||||
- configuration: new additionalResources option available for globalNetworkCheckSettings (see config.js)
|
||||
- configuration: changed default values for timeOut to 6000 and globalSyncResourcesInterval to 30000
|
||||
- configuration: added additional examples for globalNetworkCheckSettings
|
||||
- configuration: added comments for timeOut
|
||||
- changed default settings - CardDavMATE now works without any additional setup if installed into Davical subdirectory (default setup allows access to own collections for logged user)
|
||||
- renamed DAViCal auth module to generic (this module uses basic HTTP authentication to remote server)
|
||||
- added error message if non-RFC vCard is detected (please send me the problematic vCard and I will try to fix your issue)
|
||||
- added support for Opera (only for non cross domain setup)
|
||||
- fixed timeout value for LOCK requests (previously the milisecond value was used as second value)
|
||||
- fixed resource removal bug
|
||||
- added animation for contact switching (fix for graphic glitches with slow Javascript engines)
|
||||
- added default user and company icons for vCard editor
|
||||
- added icon for company contacts in contact list
|
||||
- added cancel button when creating a new contact (it reloads the previously active contact)
|
||||
- disabled edit button in vCard editor for read-only collections
|
||||
- disabled "add icon" in contact list for read-only collections
|
||||
- moved the delete button in the editor more to the right
|
||||
- autofocus for the login field (disabled for demo mode)
|
||||
- new cross browser CSS for buttons
|
||||
- fixed checkbox CSS for Opera
|
||||
- added apple-mobile-web-app-capable meta tag into index.html (useful for web app shortcuts on iOS)
|
||||
- minor CSS fixes for iOS
|
||||
- minor CSS fixes - scrollbars are shown only when needed
|
||||
|
||||
version 0.7.2 [2011-11-10]:
|
||||
- configuration: new globalNetworkCheckSettings configuration option for rapid client setup
|
||||
|
||||
version 0.7.1 [2011-11-10]:
|
||||
- improved support for non-RFC vCards by adding missing newlines (Evolution problem)
|
||||
- support for non-RFC vCards without UID parameter
|
||||
- fixed a bug that caused the vCard groups to remain in the interface even after deletion from the server
|
||||
- minor vCard group related bugfixes
|
||||
|
||||
version 0.7.0 [2011-11-09]:
|
||||
- note: this release contains many configuration changes (always use the latest config.js)
|
||||
- note: if you use DAViCal you need to update your apache configuration (see misc/config_davical.txt)
|
||||
- note: if you use MacOS X Lion calendarserver you need to re-patch your installation (see misc/readme_lion.txt and the changelog below)
|
||||
- configuration - renamed updateInterval option in globalAccountSettings to syncInterval (now the name corresponds to reality)
|
||||
- configuration - removed globalReloadCollection setting (use the syncInterval in globalAccountSettings instead)
|
||||
- configuration - added globalSyncResourcesInterval configuration option
|
||||
- configuration - added crossDomain option into globalAccountSettings and globalNetworkAccountSettings (default: true - set to false if your CardDavMATE protocol/server/port is the same as your Davical installation or if you use unsupported browser with mod_proxy /if you don't know what is mod_proxy do not set to false/)
|
||||
- configuration - updated auth module to exactly match the changed configuration options
|
||||
- configuration - renamed configuration variable in auth/plugins/ldap_conf.inc
|
||||
- new patch for MacOS X Lion calendarserver to support cross domain queries in Gecko based browsers (http://www.w3.org/TR/cors/) with updated instructions (see misc/readme_lion.txt in misc directory)
|
||||
- new auth module for DAViCal server (see auth/config.inc and auth/plugins/davical_conf.inc)
|
||||
- much better synchronization (bandwidth optimization)
|
||||
- added "vCard group" support used by Apple
|
||||
- major style sheet changes, tweaks and cleanup
|
||||
- update jQuery to version 1.7 and related fixes
|
||||
- migrate to jQuery 1.7 API
|
||||
- added IRC option into IM types
|
||||
- fixed fast collection switching concurrency problem (contacts from the previous collection are removed from the contact list)
|
||||
- fixed a bug from 0.6.x that caused the contacts to remain in the interface even after deletion from the server
|
||||
- improved support for non-RFC vCards by removing redundant newlines
|
||||
- better IMPP equivalence checking with old X-* IM attributes
|
||||
- better handling of namespaces in XML responses using custom minimalist jQuery plugin
|
||||
- added readme.txt with setup instructions
|
||||
- added help for common network/installation problems: misc/readme_network.txt
|
||||
- disallow browser to show login window popup after unsuccessful authentication using auth module (see the new $config['auth_send_authenticate_header'] option in the auth/config.inc)
|
||||
- the auth/modules/ renamed to auth/plugins/ (and related fixes)
|
||||
- fixed resource and collection sorting (wrong function call)
|
||||
- the logout button is shown only if you use globalNetworkAccountSettings
|
||||
- fixed Andorra, Jordan, Kazakhstan and Ukraine address fields
|
||||
|
||||
version 0.6.3 [2011-10-22]:
|
||||
- patch for MacOS X Lion calendarserver to support cross domain queries (misc directory)
|
||||
- updated instructions for MacOS X Lion server and moved readme.txt to misc/lion_readme.txt
|
||||
|
||||
version 0.6.2 [2011-10-22]:
|
||||
- fixed undefined variable in the error message
|
||||
|
||||
version 0.6.1 [2011-10-21]:
|
||||
- MacOSX Lion Server support (more info in readme.txt)
|
||||
- fixed login problems after previous logout
|
||||
- various bugfixes and improvements
|
||||
|
||||
version 0.6.0 [2011-10-19]:
|
||||
- major internal code cleanup
|
||||
- added default .htaccess file to prevent caching (mod_headers must be enabled!)
|
||||
- various config.js changes (always use the latest version of configuration file!)
|
||||
- instead of the static client configuration, now it is possible to set configuration URL in config.js (this URL must return valid configuration XML after successful HTTP auth)
|
||||
- added LDAP auth module which generates XML configuration for the client (after successful HTTP authentication)
|
||||
- if the configuration URL is set, the client shows login screen and deny access until the user is not authenticated (and no valid XML returned)
|
||||
- fixed a bug which causes unaccessible resources if user has no access to read the resource privileges
|
||||
- fixed an undefined variable bug which occurs when new contact is created in empty collection
|
||||
- correct UID generation for new contacts
|
||||
- correct unprocessed (unknown) elements handling when contact is edited
|
||||
- correct behavior when deleting the last contact from the collection
|
||||
- major bug fixes in resource.js and addressbook.js
|
||||
- default picture for contact (shown if picture not present in vCard)
|
||||
- added logout button (right top corner key icon)
|
||||
|
||||
version 0.5.2 [2011-10-06]:
|
||||
- fixed regular expressions for login matching in deleteVcardFromCollection and putVcardToCollection functions (fixes add/update/delete operations)
|
||||
- fixed several CSS issues
|
||||
- added new configuration option globalWithCredentials which sets withCredentials for cross domain queries in jQuery (note: if the value is set to true, use of Access-Control-Allow-Origin "*" is not allowed)
|
||||
|
||||
version 0.5.1 [2011-10-03]:
|
||||
- changed the delete operation to asynchronous (now all operations are async)
|
||||
- the contact is now reloaded in the interface immediately after the successful "save" operation (in the middle of the "save" animation)
|
||||
- minor animation fixes (especially for contact deletion)
|
||||
|
||||
version 0.5.0 [2011-10-01]:
|
||||
- initial public release
|
||||
@@ -11,11 +11,12 @@ var globalNetworkCheckSettings = {
|
||||
delegation: false,
|
||||
additionalResources: [],
|
||||
hrefLabel: null,
|
||||
forceReadOnly: null,
|
||||
forceReadOnly: false,
|
||||
ignoreAlarms: false,
|
||||
backgroundCalendars: [],
|
||||
crossDomain: false,
|
||||
withCredentials: true
|
||||
withCredentials: true,
|
||||
extendedDav: false
|
||||
};
|
||||
|
||||
// Configuración de interfaz
|
||||
@@ -78,12 +79,16 @@ var globalResourceCardDAVList = {};
|
||||
var globalUsername = '';
|
||||
var globalPassword = '';
|
||||
var globalUseJqueryAuth = true; // Habilitar autenticación jQuery para persistencia
|
||||
var globalSettingsAccount = true; // Habilitar configuración automática
|
||||
var globalSettingsAccount = false; // Deshabilitar auto-discovery
|
||||
var globalUseCache = true;
|
||||
var globalStoreLocalization = true;
|
||||
var globalRememberLogin = true; // Recordar login
|
||||
var globalStoreUserSettings = true; // Guardar configuración de usuario
|
||||
|
||||
// Deshabilitar auto-discovery y rutas automáticas
|
||||
var globalDisableAutoDiscovery = true;
|
||||
var globalForceBaseUrl = true;
|
||||
|
||||
// Configuración específica para Radicale
|
||||
var globalCrossOrigin = false;
|
||||
var globalUseCrossOrigin = false;
|
||||
@@ -120,4 +125,4 @@ var globalStoredSettings = {
|
||||
var globalAutoLogin = true; // Login automático si hay credenciales guardadas
|
||||
var globalSessionTimeout = 86400000; // Timeout de sesión: 24 horas (en millisegundos)
|
||||
var globalKeepAlive = true; // Mantener sesión activa
|
||||
var globalKeepAliveInterval = 300000; // Intervalo keep-alive: 5 minutos
|
||||
var globalKeepAliveInterval = 300000; // Intervalo keep-alive: 5 minutos
|
||||
|
||||
@@ -3,46 +3,70 @@
|
||||
// Configuración según documentación oficial de Radicale
|
||||
// https://github.com/Kozea/Radicale/wiki/Client-InfCloud
|
||||
var globalNetworkCheckSettings = {
|
||||
href: '${INFCLOUD_BASE_URL}/',
|
||||
href: '${INFCLOUD_BASE_URL}/radicale/',
|
||||
timeOut: 90000,
|
||||
lockTimeOut: 10000,
|
||||
checkContentType: false,
|
||||
settingsAccount: false,
|
||||
delegation: true,
|
||||
delegation: false,
|
||||
additionalResources: [],
|
||||
hrefLabel: null,
|
||||
forceReadOnly: null,
|
||||
forceReadOnly: false,
|
||||
ignoreAlarms: false,
|
||||
backgroundCalendars: []
|
||||
backgroundCalendars: [],
|
||||
crossDomain: false,
|
||||
withCredentials: true,
|
||||
extendedDav: false
|
||||
};
|
||||
|
||||
// Configuración de interfaz
|
||||
var globalInterfaceLanguage = 'es_ES';
|
||||
var globalInterfaceCustomLanguages = [];
|
||||
var globalInterfaceLanguage = 'en_US'; // Idioma predeterminado: Inglés
|
||||
var globalInterfaceCustomLanguages = ['es_ES', 'en_US']; // Idiomas disponibles
|
||||
var globalSortAlphabet = ' 0123456789AÁÀÂBCÇDEÉÈÊFGHIÍÌÎJKLMNOÓÒÔPQRSTUÚÙÛVWXYZaáàâbcçdeéèêfghiíìîjklmnoóòôpqrstuúùûvwxyz';
|
||||
var globalSearchTransformAlphabet = 'AÁÀÂàáâBCÇcçDEÉÈÊeéèêFGHIÍÌÎiíìîJKLMNOÓÒÔoóòôPQRSTUÚÙÛuúùûVWXYZ';
|
||||
|
||||
// Configuración de calendario
|
||||
var globalCalendarSelected = '';
|
||||
var globalTodoCalendarSelected = '';
|
||||
var globalActiveView = 'multiWeek';
|
||||
var globalActiveView = 'multiWeek'; // Vista por defecto: semana múltiple
|
||||
var globalOpenFormMode = 'double';
|
||||
var globalTodoListFilterSelected = ['filterAction', 'filterProgress', 'filterCompleted', 'filterCanceled'];
|
||||
var globalActiveApp = null;
|
||||
var globalTimeZone = 'Europe/Madrid';
|
||||
var globalTimeZone = 'Europe/Madrid'; // Zona horaria por defecto
|
||||
var globalRewriteTimezoneComponent = true;
|
||||
var globalRemoveUnknownTimezone = false;
|
||||
var globalTimeZoneSupport = true;
|
||||
var globalDisplayHiddenEvents = false;
|
||||
|
||||
// Configuraciones adicionales de usuario que se recordarán
|
||||
var globalUserPreferences = {
|
||||
defaultView: 'multiWeek', // Vista preferida del usuario
|
||||
showWeekends: true, // Mostrar fines de semana
|
||||
firstDayOfWeek: 1, // Lunes = 1, Domingo = 0
|
||||
workingHours: {start: 8, end: 18}, // Horario laboral
|
||||
timeFormat: '24h', // Formato de hora: 24h o 12h
|
||||
dateFormat: 'dd/mm/yyyy', // Formato de fecha
|
||||
showTimeZone: true, // Mostrar zona horaria
|
||||
autoRefresh: true // Refrescar automáticamente
|
||||
};
|
||||
|
||||
// Configuración de sincronización
|
||||
var globalBackgroundSync = true;
|
||||
var globalEnableRefresh = true;
|
||||
var globalEnableKbNavigation = true;
|
||||
var globalSettingsType = '';
|
||||
var globalSettingsType = 'localStorage'; // Usar localStorage para guardar configuraciones
|
||||
var globalCrossOrigin = null;
|
||||
var globalVersionCheckURL = '';
|
||||
|
||||
// Configuraciones de persistencia de datos
|
||||
var globalPersistentSettings = {
|
||||
saveCredentials: true, // Guardar credenciales de forma segura
|
||||
saveViewPreferences: true, // Guardar preferencias de vista
|
||||
saveCalendarSettings: true, // Guardar configuraciones de calendario
|
||||
saveLanguageSettings: true, // Guardar configuración de idioma
|
||||
autoSyncInterval: 30000 // Auto-sincronización cada 30 segundos
|
||||
};
|
||||
|
||||
// Configuración de vista
|
||||
var globalPreloadedPrincipals = null;
|
||||
var globalLoadedPrincipals = null;
|
||||
@@ -51,17 +75,54 @@ var globalAvailableCardDAVCollections = [];
|
||||
var globalResourceCalDAVList = {};
|
||||
var globalResourceCardDAVList = {};
|
||||
|
||||
// Configuración de autenticación
|
||||
// Configuración de autenticación y persistencia
|
||||
var globalUsername = '';
|
||||
var globalPassword = '';
|
||||
var globalUseJqueryAuth = false;
|
||||
var globalSettingsAccount = false; // Deshabilitar configuración automática
|
||||
var globalUseJqueryAuth = true; // Habilitar autenticación jQuery para persistencia
|
||||
var globalSettingsAccount = false; // Deshabilitar auto-discovery
|
||||
var globalUseCache = true;
|
||||
var globalStoreLocalization = true;
|
||||
var globalRememberLogin = true; // Recordar login
|
||||
var globalStoreUserSettings = true; // Guardar configuración de usuario
|
||||
|
||||
// Deshabilitar auto-discovery y rutas automáticas
|
||||
var globalDisableAutoDiscovery = true;
|
||||
var globalForceBaseUrl = true;
|
||||
|
||||
// Configuración específica para Radicale
|
||||
var globalCrossOrigin = true;
|
||||
var globalUseCrossOrigin = true;
|
||||
var globalCrossOrigin = false;
|
||||
var globalUseCrossOrigin = false;
|
||||
|
||||
// Variables adicionales requeridas
|
||||
var globalContactDataMinVisiblePercentage = 0.2;
|
||||
var globalContactDataMinVisiblePercentage = 0.2;
|
||||
var globalEditorFadeAnimation = 666;
|
||||
var globalEventStartPastLimit = 3;
|
||||
var globalEventStartFutureLimit = 3;
|
||||
var globalTodoStartPastLimit = 3;
|
||||
var globalTodoStartFutureLimit = 3;
|
||||
|
||||
// Variables adicionales para interfaz
|
||||
var globalHideInfoMessageAfter = 3000; // Tiempo en millisegundos para ocultar mensajes
|
||||
|
||||
// Configuración adicional para Radicale WebDAV
|
||||
var globalDefaultActiveApp = null;
|
||||
var globalSubscribedCalendars = {};
|
||||
var globalCalendarStartOfBusiness = 8;
|
||||
var globalCalendarEndOfBusiness = 17;
|
||||
var globalAMPMFormat = false;
|
||||
|
||||
// Persistencia de configuraciones de usuario
|
||||
var globalStoredSettings = {
|
||||
language: true, // Recordar idioma
|
||||
activeView: true, // Recordar vista activa (semana, mes, etc.)
|
||||
timezone: true, // Recordar zona horaria
|
||||
calendarColors: true, // Recordar colores de calendarios
|
||||
selectedCalendars: true, // Recordar calendarios seleccionados
|
||||
interfaceSettings: true // Recordar configuraciones de interfaz
|
||||
};
|
||||
|
||||
// Configuración de sesión automática
|
||||
var globalAutoLogin = true; // Login automático si hay credenciales guardadas
|
||||
var globalSessionTimeout = 86400000; // Timeout de sesión: 24 horas (en millisegundos)
|
||||
var globalKeepAlive = true; // Mantener sesión activa
|
||||
var globalKeepAliveInterval = 300000; // Intervalo keep-alive: 5 minutos
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script para generar config.js a partir del template usando variables de entorno
|
||||
|
||||
# Verificar que las variables necesarias estén definidas
|
||||
if [ -z "$RADICALE_USERNAME" ] || [ -z "$RADICALE_PASSWORD" ] || [ -z "$RADICALE_BASE_URL" ] || [ -z "$INFCLOUD_BASE_URL" ]; then
|
||||
echo "Error: Faltan variables de entorno requeridas"
|
||||
echo "Necesarias: RADICALE_USERNAME, RADICALE_PASSWORD, RADICALE_BASE_URL, INFCLOUD_BASE_URL"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generar config.js desde el template usando sed
|
||||
sed "s|\${RADICALE_USERNAME}|$RADICALE_USERNAME|g; s|\${RADICALE_PASSWORD}|$RADICALE_PASSWORD|g; s|\${RADICALE_BASE_URL}|$RADICALE_BASE_URL|g; s|\${INFCLOUD_BASE_URL}|$INFCLOUD_BASE_URL|g" /usr/share/nginx/html/config.js.template > /usr/share/nginx/infcloud/config.js
|
||||
|
||||
echo "Config.js generado con las variables de entorno:"
|
||||
echo "- Usuario: $RADICALE_USERNAME"
|
||||
echo "- URL Radicale: $RADICALE_BASE_URL"
|
||||
echo "- URL InfCloud: $INFCLOUD_BASE_URL"
|
||||
@@ -1,35 +0,0 @@
|
||||
diff -rc baikal-flat/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php baikal-flat-0.2.7.new/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php
|
||||
*** baikal-flat/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php 2013-10-02 20:38:26.000000000 +0200
|
||||
--- baikal-flat-0.2.7.new/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php 2014-02-16 16:25:15.873574244 +0100
|
||||
***************
|
||||
*** 70,75 ****
|
||||
--- 70,80 ----
|
||||
'{http://sabredav.org/ns}email-address' => array(
|
||||
'dbField' => 'email',
|
||||
),
|
||||
+
|
||||
+ /* necessary to access with PROPFIND caldavzap settings (Zellner, 2014-02-14) */
|
||||
+ '{http://inf-it.com/ns/dav/}settings' => array(
|
||||
+ 'dbField' => 'inf_it_settings',
|
||||
+ ),
|
||||
);
|
||||
|
||||
/**
|
||||
diff -rc baikal-flat/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php baikal-flat-0.2.7.new/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php
|
||||
*** baikal-flat/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php 2013-10-02 20:38:26.000000000 +0200
|
||||
--- baikal-flat-0.2.7.new/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php 2014-02-16 16:26:05.393981448 +0100
|
||||
***************
|
||||
*** 242,247 ****
|
||||
--- 242,253 ----
|
||||
'principal' => $this->getPrincipalUrl(),
|
||||
'protected' => true,
|
||||
),
|
||||
+ /* give write permissions to principal properties (Zellner, 2014-02-14) */
|
||||
+ array(
|
||||
+ 'privilege' => '{DAV:}write',
|
||||
+ 'principal' => $this->getPrincipalUrl(),
|
||||
+ 'protected' => true,
|
||||
+ ),
|
||||
);
|
||||
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
diff -ru web2/http_headers.py web2-CardDavMATE/http_headers.py
|
||||
--- web2/http_headers.py 2011-10-31 00:34:14.000000000 +0100
|
||||
+++ web2-CardDavMATE/http_headers.py 2011-10-31 00:31:07.000000000 +0100
|
||||
@@ -1531,7 +1531,14 @@
|
||||
'Set-Cookie2':(tokenize, parseSetCookie2),
|
||||
'Vary':(tokenize, filterTokens),
|
||||
'WWW-Authenticate': (lambda h: tokenize(h, foldCase=False),
|
||||
- parseWWWAuthenticate,)
|
||||
+ parseWWWAuthenticate,),
|
||||
+
|
||||
+ # begin CardDavMATE section
|
||||
+ 'Access-Control-Allow-Origin':(last,),
|
||||
+ 'Access-Control-Allow-Methods':(last,),
|
||||
+ 'Access-Control-Allow-Headers':(last,),
|
||||
+ 'Access-Control-Allow-Credentials':(last,),
|
||||
+ 'Access-Control-Expose-Headers':(last,)
|
||||
+ # end CardDavMATE section
|
||||
}
|
||||
|
||||
generator_response_headers = {
|
||||
@@ -1545,7 +1552,14 @@
|
||||
'Set-Cookie':(generateSetCookie,),
|
||||
'Set-Cookie2':(generateSetCookie2,),
|
||||
'Vary':(generateList, singleHeader),
|
||||
- 'WWW-Authenticate':(generateWWWAuthenticate,)
|
||||
+ 'WWW-Authenticate':(generateWWWAuthenticate,),
|
||||
+
|
||||
+ # begin CardDavMATE section
|
||||
+ 'Access-Control-Allow-Origin':(str, singleHeader),
|
||||
+ 'Access-Control-Allow-Methods':(str, singleHeader),
|
||||
+ 'Access-Control-Allow-Headers':(str, singleHeader),
|
||||
+ 'Access-Control-Allow-Credentials':(str, singleHeader),
|
||||
+ 'Access-Control-Expose-Headers':(str, singleHeader)
|
||||
+ # end CardDavMATE section
|
||||
}
|
||||
|
||||
parser_entity_headers = {
|
||||
diff -ru web2/server.py web2-CardDavMATE/server.py
|
||||
--- web2/server.py 2011-10-31 00:34:21.000000000 +0100
|
||||
+++ web2-CardDavMATE/server.py 2011-10-31 00:31:07.000000000 +0100
|
||||
@@ -58,6 +58,18 @@
|
||||
response.headers.setHeader('server', VERSION)
|
||||
if not response.headers.hasHeader('date'):
|
||||
response.headers.setHeader('date', time.time())
|
||||
+
|
||||
+ # begin CardDavMATE section
|
||||
+ if not response.headers.hasHeader('Access-Control-Allow-Origin'):
|
||||
+ response.headers.setHeader('Access-Control-Allow-Origin', '*')
|
||||
+ if not response.headers.hasHeader('Access-Control-Allow-Methods'):
|
||||
+ response.headers.setHeader('Access-Control-Allow-Methods','GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK')
|
||||
+ if not response.headers.hasHeader('Access-Control-Allow-Headers'):
|
||||
+ response.headers.setHeader('Access-Control-Allow-Headers','User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With')
|
||||
+ if not response.headers.hasHeader('Access-Control-Allow-Credentials'):
|
||||
+ response.headers.setHeader('Access-Control-Allow-Credentials','true')
|
||||
+ if not response.headers.hasHeader('Access-Control-Expose-Headers'):
|
||||
+ response.headers.setHeader('Access-Control-Expose-Headers','Etag,Preference-Applied')
|
||||
+ # end CardDavMATE section
|
||||
+
|
||||
return response
|
||||
defaultHeadersFilter.handleErrors = True
|
||||
|
||||
@@ -354,7 +366,7 @@
|
||||
example. This would also be the place to do any CONNECT
|
||||
processing."""
|
||||
|
||||
- if self.method == "OPTIONS" and self.uri == "*":
|
||||
+ if self.method == "OPTIONS":
|
||||
response = http.Response(responsecode.OK)
|
||||
response.headers.setHeader('allow', ('GET', 'HEAD', 'OPTIONS', 'TRACE'))
|
||||
return response
|
||||
@@ -1,24 +0,0 @@
|
||||
RewriteEngine On
|
||||
<IfModule mod_headers.c>
|
||||
Header unset Access-Control-Allow-Origin
|
||||
Header unset Access-Control-Allow-Methods
|
||||
Header unset Access-Control-Allow-Headers
|
||||
Header unset Access-Control-Allow-Credentials
|
||||
Header unset Access-Control-Expose-Headers
|
||||
|
||||
# If your setup is working and complete you can replace the "*" with CardDavMATE instalation
|
||||
# origin (protocol/host/port) - see the examples below (for multiple origins use multiple headers)
|
||||
#Header always set Access-Control-Allow-Origin "http://www.server.com"
|
||||
#Header always set Access-Control-Allow-Origin "https://www.server.com"
|
||||
#Header always set Access-Control-Allow-Origin "https://www.server.com:8080"
|
||||
|
||||
Header always set Access-Control-Allow-Origin "*"
|
||||
Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK"
|
||||
Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With"
|
||||
Header always set Access-Control-Allow-Credentials false
|
||||
Header always set Access-Control-Expose-Headers "Etag,Preference-Applied"
|
||||
|
||||
RewriteCond %{HTTP:Access-Control-Request-Method} !^$
|
||||
RewriteCond %{REQUEST_METHOD} OPTIONS
|
||||
RewriteRule ^(.*)$ $1 [R=200,L]
|
||||
</IfModule>
|
||||
@@ -1,41 +0,0 @@
|
||||
|
||||
PROBLEM:
|
||||
--------
|
||||
|
||||
caldavzap reads and saves session settings persistently in the caldav server by
|
||||
PROPPATCH / PROPFIND in a principal property '{http://inf-it.com/ns/dav/}settings'.
|
||||
|
||||
Unfortunately, sabredav and sabredav based caldav servers...
|
||||
- do not provide access to new or non-standard properties
|
||||
- do not provide write access to principal properties with PROPPATCH
|
||||
|
||||
|
||||
SOLUTION:
|
||||
---------
|
||||
|
||||
An ideal and clean solution would be a sabredav plugin which allows creation and
|
||||
access to arbitrary new principal properties. Since such a plugin doesn't exist,
|
||||
I'll show here a hack which modifies baikal to just provide the specific principal
|
||||
property '{http://inf-it.com/ns/dav/}settings' which is needed by caldavzap.
|
||||
|
||||
The following steps apply to baikal 0.2.7 but should be applicable to any
|
||||
sabredav based server.
|
||||
|
||||
1. modify your sql databse:
|
||||
add a text type database entry to the principals table which will hold the settings.
|
||||
This can be done by sql commands or by using a gui frontend for your database.
|
||||
I've named this text field 'inf_it_settings'.
|
||||
Example: the sqlite structure of the principals table should then look like this:
|
||||
CREATE TABLE 'principals' ( id INTEGER PRIMARY KEY ASC, uri TEXT, email TEXT,
|
||||
displayname TEXT, vcardurl TEXT, inf_it_settings TEXT, UNIQUE(uri) )
|
||||
|
||||
2. apply the patch baikal-flat-0.2.7-for-caldavzap.diff to patch the baikal server.
|
||||
This patch does two things:
|
||||
|
||||
a) it modifies vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php to map
|
||||
requests for the property '{http://inf-it.com/ns/dav/}settings' to the newly created
|
||||
database field inf_it_settings (see above 1.)
|
||||
|
||||
b) it modifies vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php to give write
|
||||
access to principal properties ('write' includes 'write-properties').
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
OS X Server instructions:
|
||||
|
||||
1. Calendarserver in OS X not sends headers required by web browsers to allow cross domain queries. To add these headers follow the steps below:
|
||||
- copy the misc/calendarserver.diff into any directory on your server (for example: ~/Desktop)
|
||||
Mac OS X Lion Server (for OS X Mountain Lion Server see below):
|
||||
- if your server is already patched (previous version of patch) you must restore the original files from backup:
|
||||
NOTE: if you have updated your server installation, you probably do not want to restore the old files (possible newer version of Calendarserver files)
|
||||
sudo mv /usr/share/caldavd/lib/python/twext/web2/http_headers.py.orig /usr/share/caldavd/lib/python/twext/web2/http_headers.py
|
||||
sudo mv /usr/share/caldavd/lib/python/twext/web2/server.py.orig /usr/share/caldavd/lib/python/twext/web2/server.py
|
||||
- execute the following command in the Terminal:
|
||||
sudo patch -b -d /usr/share/caldavd/lib/python/twext/web2 -i ~/Desktop/calendarserver.diff
|
||||
OS X Mountain Lion Server:
|
||||
- if your server is already patched (previous version of patch) you must restore the original files from backup:
|
||||
NOTE: if you have updated your server installation, you probably do not want to restore the old files (possible newer version of Calendarserver files)
|
||||
sudo mv /Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/twext/web2/http_headers.py.orig /Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/twext/web2/http_headers.py
|
||||
sudo mv /Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/twext/web2/server.py.orig /Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/twext/web2/server.py
|
||||
- execute the following command in the Terminal:
|
||||
sudo patch -b -d /Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/twext/web2 -i ~/Desktop/calendarserver.diff
|
||||
|
||||
2. The Digest authentication used in OS X Server is not supported directly by JavaScript in many browsers. It is recommended to disable it and enable the Basic authentication instead (or you may try the Digest auth with globalUseJqueryAuth=true in config.js). To disable the Digest authentication execute the following commands in Terminal:
|
||||
sudo serveradmin settings calendar:Authentication:Basic:Enabled = yes
|
||||
sudo serveradmin settings calendar:Authentication:Digest:Enabled = no
|
||||
|
||||
3. Restart Calendarserver services:
|
||||
sudo serveradmin stop addressbook
|
||||
sudo serveradmin start addressbook
|
||||
sudo serveradmin stop calendar
|
||||
sudo serveradmin start calendar
|
||||
|
||||
WARNING: with Basic authentication your username and password are sent over the network in plain text.
|
||||
!!! ALWAYS USE SSL with Basic authentication !!!
|
||||
|
||||
|
||||
Example config.js href values for OS X Server:
|
||||
globalAccountSettings:
|
||||
href: http://osxserver.com:8008/principals/users/USERNAME/ (INSECURE!)
|
||||
href: https://osxserver.com:8443/principals/users/USERNAME/
|
||||
globalNetworkCheckSettings:
|
||||
href: http://osxserver.com:8008/principals/users/ (INSECURE!)
|
||||
href: https://osxserver.com:8443/principals/users/
|
||||
@@ -1,64 +0,0 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/access.log;
|
||||
error_log /var/log/nginx/error.log;
|
||||
|
||||
# Proxy para peticiones CalDAV/CardDAV hacia Radicale
|
||||
location ~ ^/(caldav\.php/|radicale/|\.well-known/) {
|
||||
rewrite ^/radicale/(.*)$ /$1 break;
|
||||
rewrite ^/caldav\.php/(.*)$ /$1 break;
|
||||
proxy_pass http://radicale:5232;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# Headers para CalDAV/CardDAV
|
||||
proxy_set_header Depth $http_depth;
|
||||
proxy_set_header Destination $http_destination;
|
||||
proxy_set_header Overwrite $http_overwrite;
|
||||
|
||||
# CORS headers
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, REPORT" always;
|
||||
add_header Access-Control-Allow-Headers "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Authorization, Destination, Overwrite" always;
|
||||
add_header Access-Control-Expose-Headers "ETag" always;
|
||||
|
||||
# Preflight requests
|
||||
if ($request_method = OPTIONS) {
|
||||
return 204;
|
||||
}
|
||||
}
|
||||
|
||||
# Servir archivos estáticos de InfCloud
|
||||
location /infcloud/ {
|
||||
alias /usr/share/nginx/infcloud/;
|
||||
try_files $uri $uri/ =404;
|
||||
|
||||
# No cache para desarrollo
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate";
|
||||
add_header Pragma "no-cache";
|
||||
expires -1;
|
||||
}
|
||||
|
||||
# Servir InfCloud directamente en la raíz sin redirección
|
||||
location = / {
|
||||
alias /usr/share/nginx/infcloud/;
|
||||
try_files /index.html =404;
|
||||
}
|
||||
|
||||
# Todo lo demás a InfCloud (excepto las rutas de proxy ya definidas)
|
||||
location / {
|
||||
try_files /infcloud$uri /infcloud$uri/ /infcloud/index.html =404;
|
||||
}
|
||||
|
||||
# Security headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
}
|
||||
@@ -18,39 +18,6 @@ server {
|
||||
expires -1;
|
||||
}
|
||||
|
||||
# Proxy para usuarios CalDAV/CardDAV - EXCLUIR archivos estáticos
|
||||
location ~ ^/(?!(?:images|lib|css|js|fonts|locale|calendar|config\.js|index\.html|radicale)/)([a-zA-Z][a-zA-Z0-9_-]+)/ {
|
||||
proxy_pass http://radicale:5232/$1/;
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# Configuraciones de proxy para evitar truncamiento
|
||||
proxy_buffering off;
|
||||
proxy_request_buffering off;
|
||||
proxy_http_version 1.1;
|
||||
proxy_read_timeout 300s;
|
||||
proxy_connect_timeout 75s;
|
||||
|
||||
# Headers WebDAV específicos
|
||||
proxy_set_header Depth $http_depth;
|
||||
proxy_set_header Destination $http_destination;
|
||||
proxy_set_header Overwrite $http_overwrite;
|
||||
|
||||
# CORS headers para WebDAV
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, REPORT" always;
|
||||
add_header Access-Control-Allow-Headers "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Authorization, Destination, Overwrite" always;
|
||||
add_header Access-Control-Expose-Headers "ETag, DAV" always;
|
||||
add_header Access-Control-Allow-Credentials "true" always;
|
||||
|
||||
# Preflight requests
|
||||
if ($request_method = OPTIONS) {
|
||||
return 204;
|
||||
}
|
||||
}
|
||||
|
||||
# Proxy para Radicale según documentación oficial
|
||||
location /radicale/ {
|
||||
proxy_pass http://radicale:5232/;
|
||||
@@ -58,6 +25,10 @@ server {
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Script-Name /radicale;
|
||||
proxy_set_header X-Forwarded-Prefix /radicale;
|
||||
proxy_set_header Authorization $http_authorization;
|
||||
proxy_pass_request_headers on;
|
||||
|
||||
# Configuraciones de proxy para evitar truncamiento
|
||||
proxy_buffering off;
|
||||
@@ -65,6 +36,8 @@ server {
|
||||
proxy_http_version 1.1;
|
||||
proxy_read_timeout 300s;
|
||||
proxy_connect_timeout 75s;
|
||||
client_max_body_size 10M;
|
||||
proxy_max_temp_file_size 0;
|
||||
|
||||
# Headers WebDAV específicos
|
||||
proxy_set_header Depth $http_depth;
|
||||
@@ -98,4 +71,4 @@ server {
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
|
||||
upstream php-fpm {
|
||||
server php:9000;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm index.php;
|
||||
|
||||
# Logs
|
||||
access_log /var/log/nginx/access.log;
|
||||
error_log /var/log/nginx/error.log;
|
||||
|
||||
# Handle static files
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
access_log off;
|
||||
}
|
||||
|
||||
# Handle PHP files
|
||||
location ~ \.php$ {
|
||||
try_files $uri =404;
|
||||
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass php-fpm;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||
}
|
||||
|
||||
# Handle all other files
|
||||
location / {
|
||||
try_files $uri $uri/ =404;
|
||||
}
|
||||
|
||||
# Security headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
|
||||
# CORS headers for CalDAV/CardDAV access
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK" always;
|
||||
add_header Access-Control-Allow-Headers "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control, Authorization" always;
|
||||
}
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
What you need to know before you start to configure the client:
|
||||
1.) principal URL for your server
|
||||
2.) what is the difference between cross-domain and non cross-domain setup
|
||||
3.) cross-domain setup problems and how to solve them (if you use cross-domain setup)
|
||||
4.) digest authentication problems and how to solve them (if your server uses digest auth)
|
||||
5.) problems with SSL /https/ and invalid (or self-signed) certificates
|
||||
6.) choose your setup type (3 different setup types are supported)
|
||||
7.) HTML5 cache update
|
||||
8.) Generic installation instruction
|
||||
9.) DAViCal (non cross-domain) installation instructions
|
||||
|
||||
1.) Your principal URL
|
||||
- What is my principal URL?
|
||||
Check you server documentation!
|
||||
Example principal URLs (<USERNAME> = your username):
|
||||
http://davical.server.com/caldav.php/<USERNAME>/ (DAViCal example)
|
||||
http://baikal.server.com/card.php/principals/<USERNAME>/ (Baïkal example)
|
||||
http://radicale.server.com:5232/<USERNAME>/ (Radicale example)
|
||||
http://osx.server.com:8008/principals/users/<USERNAME>/ (OS X example 1)
|
||||
https://osx.server.com:8443/principals/users/<USERNAME>/ (OS X example 2)
|
||||
|
||||
2.) Cross-domain / non cross-domain setup
|
||||
- What is the cross-domain setup?
|
||||
If your server origin is not identical with your client installation origin then your setup is cross-domain!
|
||||
- What is the origin?
|
||||
Origin is an URL without the "full path" part => <protocol>://<domain>:<port>
|
||||
Example 1:
|
||||
URL: http://davical.server.com/caldav.php/<USERNAME>/
|
||||
Origin: http://davical.server.com:80 (default port for http is 80)
|
||||
Example 2:
|
||||
URL: https://davical.server.com/caldav.php/<USERNAME>/
|
||||
Origin: https://davical.server.com:443 (default port for https is 443)
|
||||
Example 3:
|
||||
URL: http://lion.server.com:8008/principals/users/<USERNAME>/
|
||||
Origin: http://lion.server.com:8008
|
||||
- What is my server origin?
|
||||
It is your principal URL origin
|
||||
- Complete examples?
|
||||
Example 1:
|
||||
Principal URL: https://lion.server.com:8443/principals/users/<USERNAME>/ (your server URL)
|
||||
Client URL: https://www.server.com/client/ (your client installation URL)
|
||||
=>
|
||||
Server origin: https://lion.server.com:8443
|
||||
Client origin: https://www.server.com:443
|
||||
Is this setup cross-domain? YES (server origin != client origin)
|
||||
Example 2:
|
||||
Principal URL: http://davical.server.com/caldav.php/<USERNAME>/ (your server URL)
|
||||
Client URL: http://davical.server.com/client/ (your client installation URL)
|
||||
=>
|
||||
Server origin: http://davical.server.com:80
|
||||
Client origin: http://davical.server.com:80
|
||||
Is this setup cross-domain? NO (server origin == client origin)
|
||||
NOTE: if cross-domain setup is detected you will see a warning in your browser's console!
|
||||
NOTE: cross-domain setup is detected automatically and you don't need to set it manually in config.js!
|
||||
|
||||
3.) Cross-domain setup problems and how to solve them (if you use cross-domain setup)
|
||||
- Why cross-domain setup is problematic?
|
||||
The client is written in JavaScript which has one major security limitation (it is hardcoded into browsers):
|
||||
If you want to use cross-domain setup and your server NOT returns proper HTTP CORS headers (see http://www.w3.org/TR/cors/) then JavaScript REFUSES to make requests to your server (more precisely: it performs one OPTIONS request /called preflight request/ to check HTTP headers returned by your server, and if no proper CORS headers are returned, then the real request is NOT performed!).
|
||||
- What to do to solve this problem?
|
||||
a.) Your server MUST return the following additional HTTP headers:
|
||||
Access-Control-Allow-Origin: *
|
||||
Access-Control-Allow-Methods: GET, POST, OPTIONS, PROPFIND, PROPPATCH, REPORT, PUT, MOVE, DELETE, LOCK, UNLOCK
|
||||
Access-Control-Allow-Headers: User-Agent, Authorization, Content-type, Depth, If-match, If-None-Match, Lock-Token, Timeout, Destination, Overwrite, Prefer, X-client, X-Requested-With
|
||||
Access-Control-Expose-Headers: Etag, Preference-Applied
|
||||
b.) If Access-Control-Request-Method header is sent by your browser (preflight request defined by CORS) then your server MUST return these headers for OPTIONS request WITHOUT requiring authorization and MUST return 200 (or 2xx) HTTP code (Success).
|
||||
- Howto add these headers to my CardDAV/CalDAV server?
|
||||
Check your server documentation or contact your server developer and ask for CORS or custom HTTP headers support.
|
||||
- Howto add these headers to my server if it has no support for CORS or custom HTTP headers?
|
||||
Configure custom headers in your web server /or proxy server/ configuration (if possible) - see misc/config_davical.txt for Apache example.
|
||||
|
||||
4.) Digest authentication problems and how to solve them (if your server uses digest auth)
|
||||
- Why digest authentication is problematic?
|
||||
Lot of browsers have wrong or buggy digest auth support (especially if used from JavaScript).
|
||||
- What to do to solve this problem?
|
||||
a.) Disable the digest authentication and enable the basic authentication in your server config (NOTE: ALWAYS use SSL /https/ for basic authentication!)
|
||||
b.) Alternatively (if it is not possible to switch to basic auth) you can try to enable the globalUseJqueryAuth option in config.js (NOTE: there is no guarantee that it will work in your browser)
|
||||
NOTE: if you want to use the auth module /see 6.) c.) below/ you MUST use basic auth (there is no digest auth support in this module)!
|
||||
|
||||
5.) problems with SSL /https/ and invalid (or self-signed) certificates
|
||||
- Why the client cannot connect to server with invalid/self-signed certificates?
|
||||
If a user opens a web page and the browser detects invalid/self-signed certificate it warns user about this problem, and usually shows an option to accept the server certificate (or add a security exception) manually. If the request is sent by JavaScript there is NO such option to show user the security warning, and also it is NOT possible to add security exception directly by JavaScript!
|
||||
- What to do to solve this problem?
|
||||
a.) use valid server certificate from commercial CA or
|
||||
b.) if your server certificate is not self-signed and is issued by your own CA, add your CA certificate into "Trusted Root Certificates" in your browser/system or
|
||||
c.) open the principal URL directly by browser, accept the invalid certificate (or add a security exception) manually
|
||||
|
||||
6.) Client setup types
|
||||
- What types of setup are supported by the client?
|
||||
a.) Static setup with predefined principal URL, username and password stored in config.js. For this setup use globalAccountSettings (instead of globalNetworkCheckSettings or globalNetworkAccountSettings) and set the href option to your full principal URL in config.js.
|
||||
- advantages: fast login process = no username/password is required (no login screen)
|
||||
- disadvantages: username/password is visible in your config.js (recommended ONLY for intranet or home setup)
|
||||
b.) Standard setup shows login screen and requires valid username and password from the user. For this setup use globalNetworkCheckSettings (instead of globalAccountSettings or globalNetworkAccountSettings) and set the href option to your principal URL WITHOUT the username part (username is appended to the href value from the login screen) in config.js.
|
||||
- advantages: username/password is required from the user (no visible username/password in config.js)
|
||||
- disadvantages: if a user enters wrong username/password then browser will show authentication popup window (it is NOT possible to disable it in JavaScript; see the next option)
|
||||
c.) Special setup sends username/password to the PHP auth module (auth directory) which validates your username/password against your server and if the authentication is successful then sends back a configuration XML (requires additional configuration; the resulting XML is handled IDENTICALLY as the globalAccountSettings /a.)/ configuration option). For this setup use globalNetworkAccountSettings (instead of globalAccountSettings or globalNetworkCheckSettings) and set the href value to your auth directory URL (use the default if the auth directory is stored in the client installation subdirectory). Use this setup AFTER you have working b.) and want to solve the authentication popup problem.
|
||||
- advantages: no authentication popup if you enter wrong username/password, dynamic XML configuration generator (you can generate different configurations for your users /by modifying the module configuration or the PHP code itself/)
|
||||
- disadvantages: requires PHP >= 5.3 and additional configuration, only basic authentication is supported
|
||||
Auth module configuration:
|
||||
- update your auth/config.inc:
|
||||
set the $config['auth_method'] to 'generic' (this is the default)
|
||||
set the $config['accounts'] - usually you need to change only the "http://www.server.com:80" part of the
|
||||
href value but you can also change the syncinterval and timeout values
|
||||
set the $config['auth_send_authenticate_header'] to true
|
||||
- update your auth/plugins/generic_conf.inc:
|
||||
set the $pluginconfig['base_url'] to your server origin
|
||||
set the $pluginconfig['request'] to the server path (e.g. for DAViCal: '/caldav.php')
|
||||
- visit the auth directory manually by your browser and enter your username and password - you will get
|
||||
a configuration XML for your installation (if not, check your previous settings again!)
|
||||
NOTE: the returned XML content is processed identically as the globalAccountSettings /a.)/ configuration option
|
||||
- update your auth/config.inc:
|
||||
set the $config['auth_send_authenticate_header'] back to false
|
||||
|
||||
7.) HTML5 cache update
|
||||
You MUST execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
|
||||
|
||||
8.) Generic installation instructions
|
||||
a.) read 1-7 above :-)
|
||||
b.) copy the source code into your web server directory (if you use Apache it is strongly recommended to enable the following modules: mod_expires, mod_mime and mod_deflate ... see .htaccess for more details)
|
||||
c.) set your CardDAV/CalDAV server related configuration in config.js (see 6.))
|
||||
d.) set other configuration options in config.js (see comments in config.js)
|
||||
e.) update your HTML5 cache (see 7.))
|
||||
f.) open the installation directory in your browser
|
||||
g.) login and use the client :-)
|
||||
|
||||
9.) DAViCal (non cross-domain) installation instructions
|
||||
a.) copy the source code into your DAViCal "htdocs" directory (or copy it into other directory and use web server alias in your DAViCal virtual server configuration, e.g.: "Alias /client/ /usr/share/client/")
|
||||
b.) open the installation directory in your browser
|
||||
c.) login and use the client :-) ... note: if you changed something in config.js (not required) see 7.)
|
||||
|
||||
|
||||
If something not works check the console log in your browser!
|
||||
@@ -1,2 +0,0 @@
|
||||
# Este archivo mantiene el directorio en Git
|
||||
# La configuración real está en .gitignore
|
||||
@@ -1,22 +0,0 @@
|
||||
/* InfCloud configuration for Radicale */
|
||||
var globalNetworkCheckSettings = {
|
||||
// Radicale principal URL (sin /caldav.php/)
|
||||
href: "http://radicale:5232/",
|
||||
timeOut: 90000,
|
||||
lockTimeOut: 10000,
|
||||
checkContentType: true,
|
||||
settingsAccount: true,
|
||||
delegation: true,
|
||||
additionalResources: [],
|
||||
hrefLabel: null,
|
||||
forceReadOnly: null,
|
||||
ignoreAlarms: false,
|
||||
backgroundCalendars: []
|
||||
};
|
||||
|
||||
// Idioma y opciones globales
|
||||
var globalInterfaceLanguage = 'es_ES';
|
||||
var globalBackgroundSync = true;
|
||||
var globalActiveView = 'multiWeek';
|
||||
var globalTimeZone = 'Europe/Madrid';
|
||||
var globalEnableRefresh = false;
|
||||
+193
-66
@@ -1,101 +1,228 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
USERS_FILE="config/users"
|
||||
USERS_FILE="${USERS_FILE:-config/users}"
|
||||
DEFAULT_COST="${BCRYPT_COST:-12}"
|
||||
SKIP_RESTART="${SKIP_RESTART:-0}"
|
||||
|
||||
# --- Funciones auxiliares ---
|
||||
# --- Utilidades -------------------------------------------------------------
|
||||
|
||||
function ensure_users_file() {
|
||||
if [ ! -f "$USERS_FILE" ]; then
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Gestor de usuarios Radicale
|
||||
|
||||
Uso:
|
||||
./radicale_users.sh list
|
||||
./radicale_users.sh add <usuario> [--password <pwd> | --random]
|
||||
./radicale_users.sh passwd <usuario> [--password <pwd> | --random]
|
||||
./radicale_users.sh delete <usuario> [--force]
|
||||
./radicale_users.sh --help
|
||||
|
||||
Variables:
|
||||
USERS_FILE Ruta del archivo htpasswd (por defecto config/users)
|
||||
SKIP_RESTART Si vale 1, no reinicia el contenedor automáticamente
|
||||
BCRYPT_COST Coste para htpasswd -B (por defecto 12)
|
||||
|
||||
Sin argumentos se abre el menú interactivo original.
|
||||
EOF
|
||||
}
|
||||
|
||||
ensure_users_file() {
|
||||
if [[ ! -f "$USERS_FILE" ]]; then
|
||||
echo "⚠️ No existe $USERS_FILE. Creándolo..."
|
||||
mkdir -p config
|
||||
mkdir -p "$(dirname "$USERS_FILE")"
|
||||
touch "$USERS_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
function restart_radicale() {
|
||||
echo ""
|
||||
echo "🔄 Reiniciando contenedor Radicale..."
|
||||
docker compose restart radicale >/dev/null 2>&1 || true
|
||||
echo "✅ Radicale reiniciado correctamente."
|
||||
echo ""
|
||||
require_command() {
|
||||
if ! command -v "$1" >/dev/null 2>&1; then
|
||||
echo "❌ Necesitas '$1' instalado en el sistema." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function list_users() {
|
||||
maybe_restart() {
|
||||
if [[ "$SKIP_RESTART" == "1" ]]; then
|
||||
echo "⚠️ SKIP_RESTART=1, no se reiniciará Radicale automáticamente."
|
||||
return
|
||||
fi
|
||||
echo "🔄 Reiniciando contenedor Radicale..."
|
||||
docker compose restart radicale >/dev/null 2>&1 || true
|
||||
echo "✅ Radicale reiniciado."
|
||||
}
|
||||
|
||||
generate_password() {
|
||||
if command -v openssl >/dev/null 2>&1; then
|
||||
openssl rand -base64 18
|
||||
else
|
||||
date +%s | sha256sum | head -c 16
|
||||
fi
|
||||
}
|
||||
|
||||
prompt_password() {
|
||||
local pwd confirm
|
||||
read -rs -p "Introduce contraseña: " pwd
|
||||
echo ""
|
||||
read -rs -p "Confirma contraseña: " confirm
|
||||
echo ""
|
||||
if [[ "$pwd" != "$confirm" ]]; then
|
||||
echo "❌ Las contraseñas no coinciden." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "$pwd"
|
||||
}
|
||||
|
||||
htpasswd_update() {
|
||||
local user="$1" password="$2"
|
||||
# shellcheck disable=SC2016
|
||||
printf '%s\n%s\n' "$password" "$password" | htpasswd -B -C "$DEFAULT_COST" "$USERS_FILE" "$user" >/dev/null
|
||||
}
|
||||
|
||||
list_users() {
|
||||
ensure_users_file
|
||||
echo "👥 Usuarios actuales:"
|
||||
if [ -s "$USERS_FILE" ]; then
|
||||
cut -d':' -f1 "$USERS_FILE"
|
||||
if [[ -s "$USERS_FILE" ]]; then
|
||||
cut -d':' -f1 "$USERS_FILE" | sort
|
||||
else
|
||||
echo "(ninguno)"
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
function add_user() {
|
||||
cmd_add() {
|
||||
ensure_users_file
|
||||
read -rp "Ingrese el nombre de usuario nuevo: " user
|
||||
local user="$1" password="" random=0
|
||||
shift || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--password|-p) password="$2"; shift 2 ;;
|
||||
--random|-r) random=1; shift ;;
|
||||
--no-restart) SKIP_RESTART=1; shift ;;
|
||||
*) echo "❗ Opción desconocida: $1" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
if [[ -z "$user" ]]; then
|
||||
echo "❌ Debes indicar un usuario." >&2
|
||||
exit 1
|
||||
fi
|
||||
if grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' ya existe."
|
||||
return
|
||||
echo "⚠️ El usuario '$user' ya existe." >&2
|
||||
exit 1
|
||||
fi
|
||||
htpasswd -B "$USERS_FILE" "$user"
|
||||
restart_radicale
|
||||
if [[ $random -eq 1 ]]; then
|
||||
password="$(generate_password)"
|
||||
echo "🔐 Contraseña generada para '$user': $password"
|
||||
elif [[ -z "$password" ]]; then
|
||||
password="$(prompt_password)"
|
||||
fi
|
||||
htpasswd_update "$user" "$password"
|
||||
maybe_restart
|
||||
}
|
||||
|
||||
function edit_user() {
|
||||
cmd_passwd() {
|
||||
ensure_users_file
|
||||
read -rp "Ingrese el usuario a modificar: " user
|
||||
if ! grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' no existe."
|
||||
return
|
||||
local user="$1" password="" random=0
|
||||
shift || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--password|-p) password="$2"; shift 2 ;;
|
||||
--random|-r) random=1; shift ;;
|
||||
--no-restart) SKIP_RESTART=1; shift ;;
|
||||
*) echo "❗ Opción desconocida: $1" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
if [[ ! -n "$user" ]]; then
|
||||
echo "❌ Debes indicar usuario." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "✏️ Cambiando contraseña para '$user'..."
|
||||
htpasswd -B "$USERS_FILE" "$user"
|
||||
restart_radicale
|
||||
if ! grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' no existe." >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ $random -eq 1 ]]; then
|
||||
password="$(generate_password)"
|
||||
echo "🔐 Nueva contraseña generada: $password"
|
||||
elif [[ -z "$password" ]]; then
|
||||
password="$(prompt_password)"
|
||||
fi
|
||||
htpasswd_update "$user" "$password"
|
||||
maybe_restart
|
||||
}
|
||||
|
||||
function delete_user() {
|
||||
cmd_delete() {
|
||||
ensure_users_file
|
||||
read -rp "Ingrese el usuario a eliminar: " user
|
||||
local user="$1" force=0
|
||||
shift || true
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--force|-f) force=1; shift ;;
|
||||
--no-restart) SKIP_RESTART=1; shift ;;
|
||||
*) echo "❗ Opción desconocida: $1" >&2; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
if [[ -z "$user" ]]; then
|
||||
echo "❌ Debes indicar usuario." >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! grep -q "^$user:" "$USERS_FILE"; then
|
||||
echo "⚠️ El usuario '$user' no existe."
|
||||
return
|
||||
echo "⚠️ El usuario '$user' no existe." >&2
|
||||
exit 1
|
||||
fi
|
||||
read -rp "¿Estás seguro de eliminar '$user'? (s/n): " confirm
|
||||
if [[ "$confirm" =~ ^[sS]$ ]]; then
|
||||
sed -i "/^$user:/d" "$USERS_FILE"
|
||||
restart_radicale
|
||||
echo "❌ Usuario '$user' eliminado."
|
||||
else
|
||||
echo "🚫 Operación cancelada."
|
||||
if [[ $force -eq 0 ]]; then
|
||||
read -rp "¿Eliminar '$user'? (s/N): " confirm
|
||||
[[ "$confirm" =~ ^[sS]$ ]] || { echo "🚫 Operación cancelada."; return; }
|
||||
fi
|
||||
echo ""
|
||||
sed -i.bak "/^$user:/d" "$USERS_FILE"
|
||||
rm -f "${USERS_FILE}.bak"
|
||||
echo "❌ Usuario '$user' eliminado."
|
||||
maybe_restart
|
||||
}
|
||||
|
||||
# --- Menú interactivo ---
|
||||
while true; do
|
||||
echo "========================================"
|
||||
echo "🔐 GESTOR DE USUARIOS RADICALE"
|
||||
echo "========================================"
|
||||
echo "1️⃣ Listar usuarios"
|
||||
echo "2️⃣ Crear nuevo usuario"
|
||||
echo "3️⃣ Editar contraseña de usuario"
|
||||
echo "4️⃣ Eliminar usuario"
|
||||
echo "5️⃣ Salir"
|
||||
echo "----------------------------------------"
|
||||
read -rp "Selecciona una opción [1-5]: " opt
|
||||
echo ""
|
||||
# --- Menú interactivo legado -----------------------------------------------
|
||||
interactive_menu() {
|
||||
while true; do
|
||||
echo "========================================"
|
||||
echo "🔐 GESTOR DE USUARIOS RADICALE"
|
||||
echo "========================================"
|
||||
echo "1️⃣ Listar usuarios"
|
||||
echo "2️⃣ Crear nuevo usuario"
|
||||
echo "3️⃣ Editar contraseña de usuario"
|
||||
echo "4️⃣ Eliminar usuario"
|
||||
echo "5️⃣ Salir"
|
||||
echo "----------------------------------------"
|
||||
read -rp "Selecciona una opción [1-5]: " opt
|
||||
echo ""
|
||||
case "$opt" in
|
||||
1) list_users ;;
|
||||
2) read -rp "Usuario nuevo: " user; cmd_add "$user" ;;
|
||||
3) read -rp "Usuario a modificar: " user; cmd_passwd "$user" ;;
|
||||
4) read -rp "Usuario a eliminar: " user; cmd_delete "$user" ;;
|
||||
5) echo "👋 Saliendo..."; exit 0 ;;
|
||||
*) echo "❗ Opción no válida." ;;
|
||||
esac
|
||||
echo ""
|
||||
read -rp "Presiona ENTER para continuar..." _
|
||||
clear
|
||||
done
|
||||
}
|
||||
|
||||
case "$opt" in
|
||||
1) list_users ;;
|
||||
2) add_user ;;
|
||||
3) edit_user ;;
|
||||
4) delete_user ;;
|
||||
5) echo "👋 Saliendo..."; exit 0 ;;
|
||||
*) echo "❗ Opción no válida." ;;
|
||||
# --- Punto de entrada -------------------------------------------------------
|
||||
main() {
|
||||
require_command htpasswd
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
interactive_menu
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
list) list_users ;;
|
||||
add) shift; cmd_add "${1:-}" "$@" ;;
|
||||
passwd) shift; cmd_passwd "${1:-}" "$@" ;;
|
||||
delete|remove) shift; cmd_delete "${1:-}" "$@" ;;
|
||||
--help|-h) usage ;;
|
||||
*) echo "❗ Comando desconocido: $1"; usage; exit 1 ;;
|
||||
esac
|
||||
echo ""
|
||||
read -rp "Presiona ENTER para continuar..." pause
|
||||
clear
|
||||
done
|
||||
}
|
||||
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user