1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/roundcube_ynh.git synced 2024-09-03 20:16:28 +02:00

[enh] Ask to install CardDAV plugin with presets for Baïkal and ownCloud

This commit is contained in:
Jérôme Lebleu 2016-05-15 23:51:33 +02:00
parent 9ecfb49896
commit b7ba49faf3
7 changed files with 117 additions and 264 deletions

View file

@ -23,6 +23,12 @@ or from the Web administration:
* Scroll to the bottom of the page and put `https://github.com/jeromelebleu/roundcube_ynh/tree/dev` * Scroll to the bottom of the page and put `https://github.com/jeromelebleu/roundcube_ynh/tree/dev`
under **Install custom app**. under **Install custom app**.
## Upgrade
You can upgrade to this package from the command line for testing purpose with:
$ sudo yunohost app upgrade -u https://github.com/jeromelebleu/roundcube_ynh/tree/dev roundcube
## Extend and tweaks ## Extend and tweaks
### Configuration ### Configuration
@ -75,14 +81,7 @@ steps as needed.
You can also download the plugin and put it under the `plugins/` directory. In that You can also download the plugin and put it under the `plugins/` directory. In that
case, do not forget to change ownerships to this folder to `www-data`. case, do not forget to change ownerships to this folder to `www-data`.
## TODO ## Links
* Ask for rcmcarddav installation and/or check if *Baikal* or *ownCloud*
is installed
* Move log file outside of the public folder or protect it at least
* ...
## Links ##
**Roundcube**: https://roundcube.net/ **Roundcube**: https://roundcube.net/

View file

@ -0,0 +1,41 @@
<?php
//// RCMCardDAV Plugin Admin Settings
//// ** ADDRESSBOOK PRESETS
//// PRESET FOR: baikal
//$prefs['Baïkal'] = array(
// // required attributes
// 'name' => 'Baïkal',
// 'username' => '%u',
// 'password' => '%p',
// 'url' => '{baikal_url}/card.php/addressbooks/%u/',
//
// // optional attributes
// 'active' => true,
// 'readonly' => false,
// 'refresh_time' => '00:05:00',
//
// 'fixed' => array('username', 'password'),
// 'hide' => false,
//);
//// END: baikal
//// PRESET FOR: owncloud
//$prefs['ownCloud'] = array(
// // required attributes
// 'name' => 'ownCloud',
// 'username' => '%u',
// 'password' => '%p',
// 'url' => '{owncloud_url}/remote.php/dav/addressbooks/users/%u/default/',
//
// // optional attributes
// 'active' => true,
// 'readonly' => false,
// 'refresh_time' => '00:05:00',
//
// 'fixed' => array('username', 'password'),
// 'hide' => false,
//);
//// END: owncloud

View file

@ -1,209 +0,0 @@
<?php
//// RCMCardDAV Plugin Admin Settings
//// ** GLOBAL SETTINGS
// Disallow users to add / edit / delete custom addressbooks (default: false)
//
// If true, User cannot add custom addressbooks
// If false, user can add / edit / delete custom addressbooks
//
// This option only affects custom addressbooks. Preset addressbooks (see below)
// are not affected.
// $prefs['_GLOBAL']['fixed'] = true;
// When enabled, this option hides the 'CardDAV' section inside Preferences.
// $prefs['_GLOBAL']['hide_preferences'] = true;
// Scheme for storing the CardDAV passwords.
// Options:
// plain: store as plaintext
// base64: store encoded with base64 (default)
// encrypted: store encrypted with IMAP password of the user
// NOTE: if the IMAP password of the user changes, the stored
// CardDAV passwords cannot be decrypted anymore and the user
// needs to reenter them.
// $prefs['_GLOBAL']['pwstore_scheme'] = 'base64';
//// ** ADDRESSBOOK PRESETS
// Each addressbook preset takes the following form:
/*
$prefs['<Presetname>'] = array(
// required attributes
'name' => '<Addressbook Name>',
'username' => '<CardDAV Username>',
'password' => '<CardDAV Password>',
'url' => '<CardDAV URL>',
// optional attributes
'active' => <true or false>,
'readonly' => <true or false>,
'refresh_time' => '<Refresh Time in Hours, Format HH[:MM[:SS]]>',
'preemptive_auth' => <1 or 0>,
// attributes that are fixed (i.e., not editable by the user) and
// auto-updated for this preset
'fixed' => array( < 0 or more of the other attribute keys > ),
// hide this preset from CalDAV preferences section so users can't even
// see it
'hide' => <true or false>,
);
*/
// All values in angle brackets <VALUE> have to be substituted.
//
// The meaning of the different parameters is as follows:
//
// <Presetname>: Unique preset name, must not be '_GLOBAL'. The presetname is
// not user visible and only used for an internal mapping between
// addressbooks created from a preset and the preset itself. You
// should never change this throughout its lifetime.
//
// The following parameters are REQUIRED and need to be specified for any preset.
//
// name: User-visible name of the addressbook. If the server provides
// an additional display name for the addressbooks found for the
// preset, it will be appended in brackets to this name, except
// if carddav_name_only is true (see below).
//
// username: CardDAV username to access the addressbook. Set this setting
// to '%u' to use the roundcube username.
// In case one uses an email address as username there is the
// additional option to choose '%l', which will only use the
// local part of the username (eg: user.name@example.com will
// become user.name).
//
// password: CardDAV password to access the addressbook. Set this setting
// to '%p' to use the roundcube password. The password will not
// be stored in the database when using %p.
//
// url: URL where to find the CardDAV addressbook(s). If the given URL
// refers directly to an addressbook, only this single
// addressbook will be added. If the URL points somewhere in the
// CardDAV space, but _not_ to the location of a particular
// addressbook, the server will be queried for the available
// addressbooks and all of them will be added. You can use %u
// within the URL as a placeholder for the CardDAV username.
// '%l' works the same way as it does for the username field.
//
// The following parameters are OPTIONAL and need to be specified only if the default
// value is not acceptable.
//
// active: If this parameter is false, the addressbook is not used by roundcube
// unless the user changes this setting.
// Default: true
//
// carddav_name_only:
// If this parameter is true, only the server provided displayname
// is used for addressbooks created from this preset, except if
// the server does not provide a display name.
// Default: false
//
// readonly: If this parameter is true, the addressbook will only be
// accessible in read-only mode, i.e., the user will not be able
// to add, modify or delete contacts in the addressbook.
// Default: false
//
// refresh_time: Time interval for that cached versions of the addressbook
// entries should be used, in hours. After this time interval has
// passed since the last pull from the server, it will be
// refreshed when the addressbook is accessed the next time.
// Default: 01:00:00
//
// preemptive_auth:
// If this parameter is 1, the authentication headers will be sent
// automatically with every request, regardless of the server
// requesting them or not.
// This must be set for ownCloud to work correctly.
// Default: 0
//
// fixed: Array of parameter keys that must not be changed by the user.
// Note that only fixed parameters will be automatically updated
// for existing addressbooks created from presets. Otherwise the
// user may already have changed the setting, and his change
// would be lost. You can add any of the above keys, but it the
// setting only affects parameters that can be changed via the
// settings pane (e.g., readonly cannot be changed by the user
// anyway). Still only parameters listed as fixed will
// automatically updated if the preset is changed.
// Default: empty, all settings modifiable by user
//
// !!! WARNING: Only add 'url' to the list of fixed addressbooks
// if it _directly_ points to an address book collection.
// Otherwise, the plugin will initially lookup the URLs for the
// collections on the server, and at the next login overwrite it
// with the fixed value stored here. Therefore, if you change the
// URL, you have two options:
// 1) If the new URL is a variation of the old one (e.g. hostname
// change), you can run an SQL UPDATE query directly in the
// database to adopt all addressbooks.
// 2) If the new URL is not easily derivable from the old one,
// change the key of the preset and change the URL. Addressbooks
// belonging to the old preset will be deleted upon the next
// login of the user and freshly created.
//
// hide: Whether this preset should be hidden from the CalDAV listing
// on the preferences page.
// How Preset Updates work
//
// Preset addressbooks are created for a user as she logs in.
//// ** ADDRESSBOOK PRESETS - EXAMPLE: Two Addressbook Presets
//// Preset 1: Personal
/*
$prefs['Personal'] = array(
// required attributes
'name' => 'Personal',
// will be substituted for the roundcube username
'username' => '%u',
// will be substituted for the roundcube password
'password' => '%p',
// %u will be substituted for the CardDAV username
'url' => 'https://ical.example.org/caldav.php/%u/Personal',
'active' => true,
'readonly' => false,
'refresh_time' => '02:00:00',
'fixed' => array( 'username' ),
'hide' => false,
);
*/
//// Preset 2: Corporate
/*
$prefs['Work'] = array(
'name' => 'Corporate',
'username' => 'CorpUser',
'password' => 'C0rpPasswo2d',
'url' => 'https://ical.example.org/caldav.php/%u/Corporate',
'fixed' => array( 'name', 'username', 'password' ),
'hide' => true,
);
*/
$prefs['baikal'] = array(
// required attributes
'name' => 'CardDAV',
// will be substituted for the roundcube username
'username' => '%u',
// will be substituted for the roundcube password
'password' => '%p',
// %u will be substituted for the CardDAV username
'url' => 'https://yuno_baikal_domainyuno_baikal_path/card.php/addressbooks/%u/default/',
'active' => true,
'readonly' => false,
'refresh_time' => '00:05:00',
'fixed' => array( 'username', 'password' ),
'hide' => false,
);

View file

@ -42,6 +42,15 @@
}, },
"example": "/webmail", "example": "/webmail",
"default": "/webmail" "default": "/webmail"
},
{
"name": "with_carddav",
"type": "boolean",
"ask": {
"en": "Install CardDAV synchronization plugin?",
"fr": "Installer le plugin de synchronisation CardDAV ?"
},
"default": false
} }
] ]
} }

View file

@ -88,3 +88,35 @@ init_composer() {
exec_composer "$AS_USER" "$DESTDIR" install --no-dev \ exec_composer "$AS_USER" "$DESTDIR" install --no-dev \
|| ynh_die "Unable to update Roundcube core dependencies" || ynh_die "Unable to update Roundcube core dependencies"
} }
# Install and configure CardDAV plugin for Roundcube
# usage: install_carddav DESTDIR [AS_USER]
install_carddav() {
local DESTDIR=$1
local AS_USER=${2:-www-data}
local carddav_config="${DESTDIR}/plugins/carddav/config.inc.php"
local carddav_tmp_config="${PKGDIR}/conf/carddav.config.inc.php"
exec_composer "$AS_USER" "$DESTDIR" require \
"roundcube/carddav dev-master"
# Look for installed and supported CardDAV servers
for carddav_app in "owncloud" "baikal"; do
sudo yunohost app list --installed -f "$carddav_app" | grep -q id \
|| continue
# Retrieve app settings and enable relevant preset
carddav_domain=$(ynh_app_setting_get "$carddav_app" domain)
carddav_path=$(ynh_app_setting_get "$carddav_app" path)
carddav_url="https://${carddav_domain}${carddav_path%/}"
sed -i "s#{${carddav_app}_url}#${carddav_url}#g" "$carddav_tmp_config"
sed -i \
"/\/\/\/\/ PRESET FOR: ${carddav_app}/\
,/\/\/\/\/ END: ${carddav_app}/s/^\/\///" "$carddav_tmp_config"
done
# Copy plugin the configuration file
sudo cp "$carddav_tmp_config" "$carddav_config"
sudo chown "${AS_USER}:" "$carddav_config"
}

View file

@ -9,6 +9,7 @@ app=$YNH_APP_INSTANCE_NAME
# Retrieve arguments # Retrieve arguments
domain=$1 domain=$1
path=${2%/} path=${2%/}
with_carddav=$3
# Load common variables # Load common variables
. ./_common.sh . ./_common.sh
@ -40,8 +41,8 @@ deskey=$(ynh_string_random 24)
dbpass=$(ynh_string_random) dbpass=$(ynh_string_random)
# Initialize database # Initialize database
ynh_mysql_create_db $dbname $dbuser $dbpass ynh_mysql_create_db "$dbname" "$dbuser" "$dbpass"
ynh_mysql_connect_as $dbuser $dbpass $dbname \ ynh_mysql_connect_as "$dbuser" "$dbpass" "$dbname" \
< "${TMPDIR}/SQL/mysql.initial.sql" < "${TMPDIR}/SQL/mysql.initial.sql"
# Copy and set Roundcube configuration # Copy and set Roundcube configuration
@ -68,32 +69,17 @@ exec_composer www-data "$DESTDIR" require \
"sblaisot/automatic_addressbook" "sblaisot/automatic_addressbook"
installed_plugins+=" 'contextmenu', 'automatic_addressbook'," installed_plugins+=" 'contextmenu', 'automatic_addressbook',"
# Instal CardDAV plugin
if [[ $with_carddav -eq 1 ]]; then
install_carddav "$DESTDIR" \
&& installed_plugins+=" 'carddav'," \
|| echo "Unable to install CardDAV plugin" >&2
fi
# Update Roundcube configuration # Update Roundcube configuration
sudo sed -i "s#^\s*// installed plugins#&\n ${installed_plugins}#" \ sudo sed -i "s#^\s*// installed plugins#&\n ${installed_plugins}#" \
"${DESTDIR}/config/config.inc.php" "${DESTDIR}/config/config.inc.php"
## Install rcmcarddav TODO: if baikal is detected
#sudo yunohost app list -f baikal --json | grep '"installed": true'
#if [ "$?" -eq 0 ]; then
# echo "Detected Baikal"
#
# caldavdomain=$(sudo yunohost app setting baikal domain)
# caldavpath=$(sudo yunohost app setting baikal path)
# caldavpath=${caldavpath%/}
#
# sed -i "s@yuno_baikal_domain@$caldavdomain@g" ../conf/rcmcarddav.config.inc.php
# sed -i "s@yuno_baikal_path@$caldavpath@g" ../conf/rcmcarddav.config.inc.php
# sudo cp ../conf/rcmcarddav.config.inc.php $final_path/plugins/carddav/config.inc.php
#
# sudo sed -i "s@yuno_enable_carddav@True@g" $final_path/config/main.inc.php
#
# mysql -u $dbuser -p$dbpass $dbname < ../sources/plugins/carddav/dbinit/mysql-drop.sql
# mysql -u $dbuser -p$dbpass $dbname < ../sources/plugins/carddav/dbinit/mysql.sql
#else
# mysql -u $dbuser -p$dbpass $dbname < ../sources/plugins/carddav/dbinit/mysql-drop.sql
# sudo sed -i "s@yuno_enable_carddav@False@g" $final_path/config/main.inc.php
#fi
# Copy and set nginx configuration # Copy and set nginx configuration
nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf" nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf"
sed -i "s@#PATH#@${path:-/}@g" ../conf/nginx.conf sed -i "s@#PATH#@${path:-/}@g" ../conf/nginx.conf
@ -109,7 +95,8 @@ sudo chown root: $phpfpm_conf
sudo chmod 644 $phpfpm_conf sudo chmod 644 $phpfpm_conf
# Save app settings # Save app settings
ynh_app_setting_set $app mysqlpwd $dbpass ynh_app_setting_set "$app" with_carddav "$with_carddav"
ynh_app_setting_set "$app" mysqlpwd "$dbpass"
# Reload services # Reload services
sudo service php5-fpm restart || true sudo service php5-fpm restart || true

View file

@ -21,6 +21,7 @@ domain=$(ynh_app_setting_get "$app" domain)
path=$(ynh_app_setting_get "$app" path) path=$(ynh_app_setting_get "$app" path)
path=${path%/} path=${path%/}
dbpass=$(ynh_app_setting_get "$app" mysqlpwd) dbpass=$(ynh_app_setting_get "$app" mysqlpwd)
with_carddav=$(ynh_app_setting_get "$app" with_carddav)
# Check destination directory # Check destination directory
DESTDIR="/var/www/$app" DESTDIR="/var/www/$app"
@ -72,32 +73,25 @@ exec_composer www-data "$DESTDIR" require \
"sblaisot/automatic_addressbook" "sblaisot/automatic_addressbook"
installed_plugins+=" 'contextmenu', 'automatic_addressbook'," installed_plugins+=" 'contextmenu', 'automatic_addressbook',"
# Guess with_carddav value if empty
if [[ -z "${with_carddav:-}" ]]; then
[[ -d "${DESTDIR}/plugins/carddav" ]] \
&& with_carddav=1 \
|| with_carddav=0
ynh_app_setting_set "$app" with_carddav "$with_carddav"
fi
# Update or instal CardDAV plugin
if [[ $with_carddav -eq 1 ]]; then
install_carddav "$DESTDIR" \
&& installed_plugins+=" 'carddav'," \
|| echo "Unable to install CardDAV plugin" >&2
fi
# Update Roundcube configuration # Update Roundcube configuration
sudo sed -i "s#^\s*// installed plugins#&\n ${installed_plugins}#" \ sudo sed -i "s#^\s*// installed plugins#&\n ${installed_plugins}#" \
"$rc_conf" "$rc_conf"
## Install rcmcarddav if baikal is detected
#sudo yunohost app list -f baikal --json | grep '"installed": true'
#if [ "$?" -eq 0 ]; then
# echo "Detected Baikal"
#
# caldavdomain=$(sudo yunohost app setting baikal domain)
# caldavpath=$(sudo yunohost app setting baikal path)
# caldavpath=${caldavpath%/}
#
# sed -i "s@yuno_baikal_domain@$caldavdomain@g" ../conf/rcmcarddav.config.inc.php
# sed -i "s@yuno_baikal_path@$caldavpath@g" ../conf/rcmcarddav.config.inc.php
# sudo cp ../conf/rcmcarddav.config.inc.php $final_path/plugins/carddav/config.inc.php
#
# sudo sed -i "s@yuno_enable_carddav@True@g" $final_path/config/main.inc.php
#
# mysql -u $db_user -p$db_pwd $db_user < ../sources/plugins/carddav/dbinit/mysql-drop.sql
# mysql -u $db_user -p$db_pwd $db_user < ../sources/plugins/carddav/dbinit/mysql.sql
#else
# mysql -u $db_user -p$db_pwd $db_user < ../sources/plugins/carddav/dbinit/mysql-drop.sql
# sudo sed -i "s@yuno_enable_carddav@False@g" $final_path/config/main.inc.php
#fi
# Copy and set nginx configuration # Copy and set nginx configuration
nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf" nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf"
sed -i "s@#PATH#@${path:-/}@g" ../conf/nginx.conf sed -i "s@#PATH#@${path:-/}@g" ../conf/nginx.conf