mirror of
https://github.com/YunoHost-Apps/rainloop_ynh.git
synced 2024-09-03 20:16:18 +02:00
commit
d36dedc2aa
23 changed files with 560 additions and 146 deletions
24
README.md
24
README.md
|
@ -1,6 +1,6 @@
|
|||
# Rainloop for YunoHost
|
||||
|
||||
* [rainloop](http://rainloop.net/ ): 1.9.3.365
|
||||
* [rainloop](http://rainloop.net/ ): 1.10.5.192
|
||||
|
||||
## English
|
||||
Rainloop is a lightweight webmail.
|
||||
|
@ -9,15 +9,16 @@ To configure it, go to http://DOMAIN.TLD/rainloop/app/?admin
|
|||
|
||||
- The default login is : admin
|
||||
- The default password is : Password chosen during install
|
||||
- If you lost the admin password, you can retrieve it using ``sudo yunohost app settings rainloop password``
|
||||
|
||||
Each user can add a remote carddav server from their own parameters interface.
|
||||
If you use baikal, the CardDav address is :
|
||||
https://DOMAIN.TLD/baikal/card.php/addressbooks/USER/default/
|
||||
|
||||
- to upgrade the app once a new rainloop version is available, simply run in a local shell via ssh or otherwise :
|
||||
- for testing use
|
||||
``sudo yunohostapp upgrade -u https://github.com/YunoHostPlugins-Testing/rainloop_ynh rainloop``
|
||||
- for release
|
||||
- If you use baikal, the CardDav address is: https://DOMAIN.TLD/baikal/card.php/addressbooks/USER/default/
|
||||
- If you use NextCloud, the CardDav address is: https://DOMAIN.TLD/nextcloud/remote.php/carddav/addressbooks/USER/contacts
|
||||
|
||||
Rainloop saves your PGP private keys in the browser storage. This means that you will loose your private keys if you clear your browser storage (e.g., private browsing, different computer...). This packages integrates [PGPback by chtixof](https://github.com/chtixof/pgpback_ynh) so you can store your PGP private keys on the server securely. Go to **http://DOMAIN.TLD/rainloop/pgpback** to backup your PGP keys on the server or restore them.
|
||||
|
||||
To upgrade the app once a new rainloop version is available, simply run in a local shell via ssh or otherwise :
|
||||
``sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/rainloop_ynh rainloop``
|
||||
|
||||
|
||||
|
@ -28,14 +29,15 @@ Pour le configurer après l'installation, veuillez vous rendre sur http://DOMAIN
|
|||
|
||||
- Le nom d'utilisateur admin par défaut est : admin
|
||||
- Le mot de passe admin par défaut est : Mot de passe choisi lors de l'installation
|
||||
- Si vous avez oublié votre mot de passe, vous pouvez le retrouver avec ``sudo yunohost app settings rainloop password``
|
||||
|
||||
Chaque utilisateur peut ajouter un carnet d'adresse distant CardDav via leur propre paramètres.
|
||||
Si vous utilisez Baikal, l'adresse à renseigner est du type :
|
||||
https://DOMAIN.TLD/baikal/card.php/addressbooks/UTILISATEUR/default/
|
||||
|
||||
- Si vous utilisez Baikal, l'adresse à renseigner est du type : https://DOMAIN.TLD/baikal/card.php/addressbooks/UTILISATEUR/default/
|
||||
- Si vous utilisez NextCloud, l'adresse à renseigner est du type : https://DOMAIN.TLD/nextcloud/remote.php/carddav/addressbooks/USER/contacts
|
||||
|
||||
- pour mettre à jour rainloop lorsqu'une nouvelle version est disponible, lancez en console locale (ssh ou autre) :
|
||||
Rainloop stocke les clés PGP privées dans le stockage de navigateur. Cela implique que vos clés seront perdues quand vous videz le stockage de navigateur (navigation incognito, changement d'ordinateur, ...). Ce paquet intègre [PGPback de chtixof](https://github.com/chtixof/pgpback_ynh) pour que vous puissiez stocker vos clés privées PGP de manière sécurisée sur le serveur. Rendez-vous **http://DOMAIN.TLD/rainloop/pgpback** pour stocker vos clés privées PGP sur le serveur ou les restaurer dans un nouveau navigateur.
|
||||
|
||||
``sudo yunohost app upgrade -u https://github.com/YunoHostPlugins-Testing/rainloop_ynh rainloop``
|
||||
Pour mettre à jour rainloop lorsqu'une nouvelle version est disponible, lancez en console locale (ssh ou autre) :
|
||||
``sudo yunohost app upgrade -u https://github.com/YunoHost-Apps/rainloop_ynh rainloop``
|
||||
|
||||
|
|
52
check_process
Normal file
52
check_process
Normal file
|
@ -0,0 +1,52 @@
|
|||
;; Test Rainloop LDAP suggestions
|
||||
auto_remove=1
|
||||
; Manifest
|
||||
domain="domain.tld" (DOMAIN)
|
||||
path="/rainloop" (PATH)
|
||||
is_public="No" (PUBLIC|public=Yes|private=No)
|
||||
password="password" (PASSWORD)
|
||||
ldap="Yes" (LDAP)
|
||||
lang="English" (LANG)
|
||||
; Checks
|
||||
pkg_linter=1
|
||||
setup_sub_dir=1
|
||||
setup_root=1
|
||||
setup_nourl=0
|
||||
setup_private=1
|
||||
setup_public=1
|
||||
upgrade=1
|
||||
backup_restore=1
|
||||
multi_instance=0
|
||||
wrong_user=1
|
||||
wrong_path=1
|
||||
incorrect_path=1
|
||||
corrupt_source=0
|
||||
fail_download_source=0
|
||||
port_already_use=0
|
||||
final_path_already_use=0
|
||||
;; Test Rainloop no LDAP suggestions
|
||||
auto_remove=1
|
||||
; Manifest
|
||||
domain="domain.tld" (DOMAIN)
|
||||
path="/rainloop" (PATH)
|
||||
is_public="No" (PUBLIC|public=Yes|private=No)
|
||||
password="password" (PASSWORD)
|
||||
ldap="No" (LDAP)
|
||||
lang="English" (LANG)
|
||||
; Checks
|
||||
pkg_linter=1
|
||||
setup_sub_dir=1
|
||||
setup_root=1
|
||||
setup_nourl=0
|
||||
setup_private=1
|
||||
setup_public=1
|
||||
upgrade=1
|
||||
backup_restore=1
|
||||
multi_instance=0
|
||||
wrong_user=1
|
||||
wrong_path=1
|
||||
incorrect_path=1
|
||||
corrupt_source=0
|
||||
fail_download_source=0
|
||||
port_already_use=0
|
||||
final_path_already_use=0
|
16
conf/data/domains/default.ini
Normal file
16
conf/data/domains/default.ini
Normal file
|
@ -0,0 +1,16 @@
|
|||
imap_host = "auto"
|
||||
imap_port = 993
|
||||
imap_secure = "SSL"
|
||||
imap_short_login = Off
|
||||
sieve_use = Off
|
||||
sieve_allow_raw = Off
|
||||
sieve_host = ""
|
||||
sieve_port = 4190
|
||||
sieve_secure = "None"
|
||||
smtp_host = "auto"
|
||||
smtp_port = 465
|
||||
smtp_secure = "SSL"
|
||||
smtp_short_login = Off
|
||||
smtp_auth = On
|
||||
smtp_php_mail = Off
|
||||
white_list = ""
|
|
@ -1 +0,0 @@
|
|||
gmail.com,outlook.com,qq.com,yahoo.com,
|
|
@ -2,11 +2,11 @@ imap_host = "localhost"
|
|||
imap_port = 993
|
||||
imap_secure = "SSL"
|
||||
imap_short_login = On
|
||||
sieve_use = Off
|
||||
sieve_allow_raw = Off
|
||||
sieve_host = ""
|
||||
sieve_use = On
|
||||
sieve_allow_raw = On
|
||||
sieve_host = "localhost"
|
||||
sieve_port = 4190
|
||||
sieve_secure = "None"
|
||||
sieve_secure = "TLS"
|
||||
smtp_host = "localhost"
|
||||
smtp_port = 465
|
||||
smtp_secure = "SSL"
|
||||
|
|
|
@ -5,12 +5,16 @@ location PATHTOCHANGE {
|
|||
rewrite ^ https://$server_name$request_uri? permanent;
|
||||
}
|
||||
|
||||
location ^~ PATHTOCHANGEapp/data {
|
||||
location ^~ PATHTOCHANGE/app/data {
|
||||
deny all;
|
||||
}
|
||||
|
||||
location ^~ PATHTOCHANGE/pgpback/keys {
|
||||
deny all;
|
||||
}
|
||||
|
||||
client_max_body_size 10G;
|
||||
index index.php;
|
||||
index index.php index.html;
|
||||
try_files $uri $uri/ index.php;
|
||||
location ~ [^/]\.php(/|$) {
|
||||
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
|
||||
|
|
7
hooks/post_domain_add
Normal file
7
hooks/post_domain_add
Normal file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
app='rainloop' # This could never work with multi-instance. Need to find a better way
|
||||
domain=$1
|
||||
rainloop_path=/var/www/$app/app
|
||||
|
||||
sudo cp ../conf/data/domains/domain.tld.ini $rainloop_path/data/_data_/_default_/domains/$domain.ini
|
7
hooks/post_domain_remove
Normal file
7
hooks/post_domain_remove
Normal file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
app='rainloop' # This could never work with multi-instance. Need to find a better way
|
||||
domain=$1
|
||||
rainloop_path=/var/www/$app/app
|
||||
|
||||
sudo rm $rainloop_path/data/_data_/_default_/domains/$domain.ini
|
|
@ -1,22 +1,25 @@
|
|||
{
|
||||
"packaging_format": 1,
|
||||
"name": "Rainloop",
|
||||
"id": "rainloop",
|
||||
"description": {
|
||||
"en": "Lightweight webmail",
|
||||
"fr": "Webmail leger"
|
||||
"en": "Lightweight multi-account webmail",
|
||||
"fr": "Webmail léger multi-comptes"
|
||||
},
|
||||
"url": "http://rainloop.net/",
|
||||
"license": "free",
|
||||
"maintainer": {
|
||||
"name": "scith, Djip007",
|
||||
"email": "none@domaine.org"
|
||||
"name": "scith, Djip007"
|
||||
},
|
||||
"multi_instance": "false",
|
||||
"multi_instance": false,
|
||||
"services": [
|
||||
"nginx",
|
||||
"php5-fpm",
|
||||
"mysql"
|
||||
],
|
||||
"requirements": {
|
||||
"yunohost": ">= 2.4.0"
|
||||
},
|
||||
"arguments": {
|
||||
"install" : [
|
||||
{
|
||||
|
@ -38,7 +41,7 @@
|
|||
"example": "/rainloop",
|
||||
"default": "/rainloop"
|
||||
},
|
||||
{
|
||||
{
|
||||
"name": "is_public",
|
||||
"ask": {
|
||||
"en": "Is it a public application?",
|
||||
|
@ -46,16 +49,16 @@
|
|||
},
|
||||
"choices": ["Yes", "No"],
|
||||
"default": "No"
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"name": "password",
|
||||
"type": "password",
|
||||
"ask": {
|
||||
"en": "Choose a strong password for the 'admin' user",
|
||||
"fr": "Choisissez un mot de passe fort pour l'administrateur 'admin'"
|
||||
}
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"name": "ldap",
|
||||
"ask": {
|
||||
"en": "Do you want to add YunoHost users to the recipients suggestions?",
|
||||
|
@ -63,8 +66,8 @@
|
|||
},
|
||||
"choices": ["Yes", "No"],
|
||||
"default": "Yes"
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"name": "lang",
|
||||
"ask": {
|
||||
"en": "Select default language",
|
||||
|
@ -72,7 +75,7 @@
|
|||
},
|
||||
"choices": ["English", "Francais"],
|
||||
"default": "English"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
27
scripts/backup
Normal file
27
scripts/backup
Normal file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Exit on command errors and treat unset variables as an error
|
||||
set -eu
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
# Set app specific variables
|
||||
dbname=$app
|
||||
dbuser=$app
|
||||
|
||||
# Source app helpers
|
||||
. /usr/share/yunohost/helpers
|
||||
|
||||
# Retrieve app settings
|
||||
domain=$(ynh_app_setting_get "$app" domain)
|
||||
path=$(ynh_app_setting_get "$app" path)
|
||||
dbpass=$(ynh_app_setting_get "$app" mysqlpwd)
|
||||
|
||||
# Copy the app files
|
||||
DESTDIR="/var/www/$app"
|
||||
ynh_backup "$DESTDIR" "sources"
|
||||
|
||||
# Copy the conf files
|
||||
ynh_backup "/etc/nginx/conf.d/${domain}.d/${app}.conf" "nginx.conf"
|
||||
|
||||
# Dump the database
|
||||
mysqldump -u "$dbuser" -p"$dbpass" --no-create-db "$dbname" > ./dump.sql
|
112
scripts/install
112
scripts/install
|
@ -1,53 +1,64 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
app=rainloop
|
||||
|
||||
# Exit on command errors and treat unset variables as an error
|
||||
set -eu
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
rainloop_version='1.10.5.192'
|
||||
|
||||
# Source app helpers
|
||||
. /usr/share/yunohost/helpers
|
||||
|
||||
# Retrieve arguments
|
||||
domain=$1
|
||||
path=$2
|
||||
is_public=$3
|
||||
password=$4
|
||||
ldap=$5
|
||||
lang=$6
|
||||
domain=$YNH_APP_ARG_DOMAIN
|
||||
path=$YNH_APP_ARG_PATH
|
||||
is_public=$YNH_APP_ARG_IS_PUBLIC
|
||||
password=$YNH_APP_ARG_PASSWORD
|
||||
ldap=$YNH_APP_ARG_LDAP
|
||||
lang=$YNH_APP_ARG_LANG
|
||||
|
||||
# Removal of trailing /
|
||||
if [ $path = "/" ]
|
||||
then
|
||||
echo "Installation on the root of the domain"
|
||||
else
|
||||
path=${path%/}
|
||||
# Correct path
|
||||
if [ "${path:0:1}" != "/" ]; then
|
||||
path="/$path"
|
||||
fi
|
||||
if [ "${path:${#path}-1}" == "/" ] && [ ${#path} -gt 1 ]; then
|
||||
path="${path:0:${#path}-1}"
|
||||
fi
|
||||
|
||||
# Check domain/path availability
|
||||
sudo yunohost app checkurl $domain$path -a rainloop
|
||||
if [[ ! $? -eq 0 ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generate random password
|
||||
db_pwd=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d 'A-Za-z0-9' | sed -n 's/\(.\{24\}\).*/\1/p')
|
||||
sudo yunohost app checkurl "${domain}${path}" -a "$app" \
|
||||
|| ynh_die "Path not available: ${domain}${path}"
|
||||
|
||||
# Use 'rainloop' as database name and user
|
||||
db_user=$app
|
||||
dbuser=$app
|
||||
dbname=$app
|
||||
dbpass=$(ynh_string_random)
|
||||
|
||||
# Initialize database and store mysql password for upgrade
|
||||
sudo yunohost app initdb $db_user -p $db_pwd
|
||||
sudo yunohost app setting $app mysqlpwd -v $db_pwd
|
||||
ynh_mysql_create_db "$dbname" "$dbuser" "$dbpass"
|
||||
ynh_app_setting_set "$app" mysqlpwd "$dbpass"
|
||||
|
||||
# Create the final path and copy sources
|
||||
final_path=/var/www/$app
|
||||
rainloop_path=${final_path}/app
|
||||
#rainloop_path=${final_path}
|
||||
|
||||
sudo rm -rf $final_path
|
||||
sudo mkdir -p $final_path
|
||||
sudo mkdir -p $rainloop_path
|
||||
|
||||
# Use of latest community edition
|
||||
sudo unzip -q ../sources/rainloop-community.zip -d $rainloop_path/
|
||||
# Download sources and keys
|
||||
sudo wget -q https://github.com/RainLoop/rainloop-webmail/releases/download/v${rainloop_version}/rainloop-community-${rainloop_version}.zip
|
||||
sudo wget -q https://github.com/RainLoop/rainloop-webmail/releases/download/v${rainloop_version}/rainloop-community-${rainloop_version}.zip.asc
|
||||
sudo wget -q https://repository.rainloop.net/RainLoop.asc
|
||||
# Verify the integrity of sources
|
||||
sudo gpg --import --quiet RainLoop.asc
|
||||
sudo gpg --verify --quiet rainloop-community-${rainloop_version}.zip.asc rainloop-community-${rainloop_version}.zip || ynh_die "Download failed"
|
||||
sudo gpg --batch --delete-key --yes Rainloop
|
||||
# Unzip
|
||||
sudo unzip -qq rainloop-community-${rainloop_version}.zip -d $rainloop_path/
|
||||
|
||||
# Install plugins
|
||||
sudo mkdir -p $rainloop_path/data/_data_/_default_/plugins
|
||||
sudo cp -rf ../sources/plugins/auto-domain-grab $rainloop_path/data/_data_/_default_/plugins/.
|
||||
sudo cp -rf ../sources/plugins/ynh-login-mapping $rainloop_path/data/_data_/_default_/plugins/.
|
||||
sudo cp -rf ../sources/plugins/ynh-ldap-suggestions $rainloop_path/data/_data_/_default_/plugins/.
|
||||
|
||||
|
@ -66,52 +77,48 @@ app=rainloop
|
|||
*)
|
||||
lang="en"
|
||||
esac
|
||||
|
||||
ynh_app_setting_set "$app" lang "$lang"
|
||||
|
||||
# Set plugins
|
||||
plugins="ynh-login-mapping"
|
||||
plugins="auto-domain-grab" # This plugin is trying to automatically grab unknown domains if users want to add external email accounts
|
||||
if [ "$ldap" = "Yes" ];
|
||||
then
|
||||
plugins="$plugins,ynh-ldap-suggestions"
|
||||
plugins="$plugins,ynh-ldap-suggestions" # This plugin is to suggest YunoHost users in recipients list
|
||||
fi
|
||||
sudo yunohost app setting $app plugins -v $plugins
|
||||
ynh_app_setting_set "$app" plugins "$plugins"
|
||||
|
||||
sudo cp ../conf/data/configs/application.ini $application_file
|
||||
sudo sed -i "s@domain.tld@$domain@g" $application_file
|
||||
sudo sed -i "s@MYSQLUSER@$db_user@g" $application_file
|
||||
sudo sed -i "s@MYSQLPASSWORD@$db_pwd@g" $application_file
|
||||
sudo sed -i "s@MYSQLUSER@$dbuser@g" $application_file
|
||||
sudo sed -i "s@MYSQLPASSWORD@$dbpass@g" $application_file
|
||||
sudo sed -i "s@LANGTOCHANGE@$lang@g" $application_file
|
||||
sudo sed -i "s@PLUGINSTOENABLE@$plugins@g" $application_file
|
||||
|
||||
# Set admin password
|
||||
sudo php ../conf/config.php --index="$rainloop_path/index.php" --password="$password"
|
||||
ynh_app_setting_set "$app" password "$password"
|
||||
|
||||
# Add default domain configs by looping through all the domains already added
|
||||
sudo mkdir -p $rainloop_path/data/_data_/_default_/domains/
|
||||
|
||||
# get list of ldap domains
|
||||
alldomains=`ldapsearch -LLL -x -b ou=domains,dc=yunohost,dc=org -s one "objectclass=top" virtualdomain | grep -v "dn:" | sed "s/virtualdomain://" `
|
||||
for ldomain in $alldomains ; do
|
||||
sudo cp ../conf/data/domains/domain.tld.ini $rainloop_path/data/_data_/_default_/domains/$ldomain.ini
|
||||
done
|
||||
sudo cp ../conf/data/domains/disabled $rainloop_path/data/_data_/_default_/domains/disabled
|
||||
# Add wildcard domain for auto-grab
|
||||
sudo cp ../conf/data/domains/default.ini $rainloop_path/data/_data_/_default_/domains/default.ini
|
||||
|
||||
# Hooks for domains are not implemented yet, so new domains will not be added automatically
|
||||
|
||||
# install SSO and auto version - at the moment the index is the SSO and rainloop is installed in /app
|
||||
if [ $final_path == $rainloop_path ]
|
||||
then
|
||||
# use modified version of master index.php that implement sso
|
||||
sudo cp ../sources/sso/index.php $final_path/index.php
|
||||
else
|
||||
# use only sso on master
|
||||
sudo cp ../sources/sso/sso.php $final_path/index.php
|
||||
sudo cp ../sources/patch/index_auto_version.php $rainloop_path/index.php
|
||||
fi
|
||||
# install SSO - at the moment the index is the SSO and rainloop is installed in /app
|
||||
sudo cp ../sources/sso/sso.php $final_path/index.php
|
||||
sudo sed -i "s@domain.tld@$domain@g" $final_path/index.php
|
||||
sudo sed -i "s@PATHTOCHANGE@$path@g" $final_path/index.php
|
||||
|
||||
# Install PGPback by chtixof to allow users to backup/restore their PGP private keys on the server
|
||||
sudo cp -rf ../sources/pgpback $final_path/.
|
||||
|
||||
# Set permissions to rainloop directory
|
||||
sudo find $final_path/. -type d -exec chmod 755 {} \;
|
||||
sudo find $final_path/. -type f -exec chmod 644 {} \;
|
||||
sudo chown -R www-data:www-data $final_path
|
||||
|
||||
# Install Nginx configuration file
|
||||
|
@ -130,13 +137,12 @@ app=rainloop
|
|||
sudo chmod 644 $finalphpconf
|
||||
|
||||
# Make app public if necessary
|
||||
sudo yunohost app setting $app is_public -v "$is_public"
|
||||
ynh_app_setting_set "$app" is_public "$is_public"
|
||||
if [ "$is_public" = "Yes" ];
|
||||
then
|
||||
sudo yunohost app setting $app skipped_uris -v "/"
|
||||
ynh_app_setting_set "$app" skipped_uris "/"
|
||||
fi
|
||||
|
||||
# Reload Nginx and regenerate SSOwat conf
|
||||
sudo service php5-fpm reload
|
||||
sudo service nginx reload
|
||||
sudo yunohost app ssowatconf
|
||||
# Reload services
|
||||
sudo service php5-fpm restart || true
|
||||
sudo service nginx reload || true
|
||||
|
|
|
@ -1,18 +1,29 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
app=rainloop
|
||||
|
||||
db_user=$app
|
||||
db_name=$app
|
||||
root_pwd=$(sudo cat /etc/yunohost/mysql)
|
||||
domain=$(sudo yunohost app setting $app domain)
|
||||
# Exit on command errors and treat unset variables as an error
|
||||
set -eu
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
mysql -u root -p$root_pwd -e "DROP DATABASE $db_name ; DROP USER $db_user@localhost ;"
|
||||
sudo rm -rf /var/www/$app
|
||||
sudo rm -f /etc/nginx/conf.d/$domain.d/$app.conf
|
||||
sudo rm -f /etc/php5/fpm/pool.d/$app.conf
|
||||
# Source app helpers
|
||||
. /usr/share/yunohost/helpers
|
||||
|
||||
sudo service php5-fpm restart
|
||||
sudo service nginx reload
|
||||
sudo yunohost app ssowatconf
|
||||
# Retrieve arguments
|
||||
dbuser=$app
|
||||
dbname=$app
|
||||
domain=$(ynh_app_setting_get "$app" domain)
|
||||
|
||||
# Drop MySQL database and user
|
||||
ynh_mysql_drop_db "$dbname" 2>&1 || true
|
||||
ynh_mysql_drop_user "$dbuser" 2>&1 || true
|
||||
|
||||
# Delete app directory and configurations
|
||||
sudo rm -rf "/var/www/${app}"
|
||||
sudo rm -f "/etc/php5/fpm/pool.d/${app}.conf"
|
||||
[[ -n $domain ]] && sudo rm -f "/etc/nginx/conf.d/${domain}.d/${app}.conf"
|
||||
|
||||
# Remove GPG key
|
||||
sudo gpg --batch --delete-key --yes Rainloop
|
||||
|
||||
# Reload services
|
||||
sudo service php5-fpm restart || true
|
||||
sudo service nginx reload || true
|
||||
|
|
56
scripts/restore
Normal file
56
scripts/restore
Normal file
|
@ -0,0 +1,56 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Exit on command errors and treat unset variables as an error
|
||||
set -eu
|
||||
|
||||
# Get multi-instances specific variables
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
# Source app helpers
|
||||
. /usr/share/yunohost/helpers
|
||||
|
||||
# Retrieve old app settings
|
||||
domain=$(ynh_app_setting_get "$app" domain)
|
||||
path=$(ynh_app_setting_get "$app" path)
|
||||
dbname=$app
|
||||
dbuser=$app
|
||||
dbpass=$(ynh_app_setting_get "$app" mysqlpwd)
|
||||
|
||||
# Check domain/path availability
|
||||
sudo yunohost app checkurl "${domain}${path}" -a "$app" \
|
||||
|| exit 1
|
||||
|
||||
# Check destination directory
|
||||
DESTDIR="/var/www/$app"
|
||||
[[ -d $DESTDIR ]] && ynh_die \
|
||||
"The destination directory '$DESTDIR' already exists.\
|
||||
You should safely delete it before restoring this app."
|
||||
|
||||
# Check configuration files
|
||||
nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf"
|
||||
[[ -f $nginx_conf ]] && ynh_die \
|
||||
"The NGINX configuration already exists at '${nginx_conf}'.
|
||||
You should safely delete it before restoring this app."
|
||||
phpfpm_conf="/etc/php5/fpm/pool.d/${app}.conf"
|
||||
[[ -f $phpfpm_conf ]] && ynh_die \
|
||||
"The PHP FPM configuration already exists at '${phpfpm_conf}'.
|
||||
You should safely delete it before restoring this app."
|
||||
|
||||
# Restore the app files
|
||||
sudo cp -a ./sources "$DESTDIR"
|
||||
|
||||
# Create and restore the database
|
||||
ynh_mysql_create_db $dbname $dbuser $dbpass
|
||||
ynh_mysql_connect_as $dbuser $dbpass $dbname < ./dump.sql
|
||||
|
||||
# Fix installation directories and permissions
|
||||
sudo mkdir -p "${DESTDIR}/logs" "${DESTDIR}/temp"
|
||||
sudo chown -R www-data: "$DESTDIR"
|
||||
|
||||
# Restore configuration files
|
||||
sudo cp -a ./nginx.conf "$nginx_conf"
|
||||
sudo cp -a ./php-fpm.conf "$phpfpm_conf"
|
||||
|
||||
# Reload services
|
||||
sudo service php5-fpm restart || true
|
||||
sudo service nginx reload || true
|
|
@ -1,48 +1,76 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
app=rainloop
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
rainloop_version='1.10.5.192'
|
||||
|
||||
# Backup the current version of the app, restore it if the upgrade fails
|
||||
sudo yunohost backup delete $app-before-upgrade
|
||||
sudo yunohost backup create --ignore-hooks --apps $app --name $app-before-upgrade --quiet
|
||||
EXIT_PROPERLY () {
|
||||
trap '' EXIT
|
||||
set +eu
|
||||
sudo yunohost backup restore --ignore-hooks $app-before-upgrade --apps $app --force --quiet # Restore the backup if upgrade failed
|
||||
ynh_die "Upgrade failed. The app was restored to the way it was before the failed upgrade."
|
||||
}
|
||||
set -eu
|
||||
trap EXIT_PROPERLY ERR
|
||||
|
||||
# Source app helpers
|
||||
. /usr/share/yunohost/helpers
|
||||
|
||||
# Retrieve arguments
|
||||
domain=$(sudo yunohost app setting $app domain)
|
||||
path=$(sudo yunohost app setting $app path)
|
||||
is_public=$(sudo yunohost app setting $app is_public)
|
||||
dp_pwd=$(sudo yunohost app setting $app mysqlpwd)
|
||||
domain=$(ynh_app_setting_get "$app" domain)
|
||||
path=$(ynh_app_setting_get "$app" path)
|
||||
is_public=$(ynh_app_setting_get "$app" is_public)
|
||||
password=$(ynh_app_setting_get "$app" password)
|
||||
ldap=$(ynh_app_setting_get "$app" ldap)
|
||||
lang=$(ynh_app_setting_get "$app" lang)
|
||||
dp_pwd=$(ynh_app_setting_get "$app" mysqlpwd)
|
||||
db_user=$app
|
||||
plugins=$(sudo yunohost app setting $app plugins)
|
||||
plugins=$(ynh_app_setting_get "$app" plugins)
|
||||
|
||||
# Correct path
|
||||
if [ "${path:0:1}" != "/" ]; then
|
||||
path="/$path"
|
||||
fi
|
||||
if [ "${path:${#path}-1}" == "/" ] && [ ${#path} -gt 1 ]; then
|
||||
path="${path:0:${#path}-1}"
|
||||
fi
|
||||
|
||||
# no update for db now...
|
||||
|
||||
# Create the final path and copy sources
|
||||
# Copy the new sources
|
||||
final_path=/var/www/$app
|
||||
rainloop_path=${final_path}/app
|
||||
sudo rm -rf $rainloop_path/rainloop # Remove the previous Rainloop files except data
|
||||
|
||||
# the old version is not deleted... the new version is in a new path
|
||||
|
||||
# Use of latest community edition
|
||||
sudo unzip -q ../sources/rainloop-community.zip -d $rainloop_path/
|
||||
|
||||
# Update patch to auto load version
|
||||
sudo cp ../sources/patch/index_auto_version.php $rainloop_path/index.php
|
||||
# Download sources and keys
|
||||
sudo wget -q https://github.com/RainLoop/rainloop-webmail/releases/download/v${rainloop_version}/rainloop-community-${rainloop_version}.zip
|
||||
sudo wget -q https://github.com/RainLoop/rainloop-webmail/releases/download/v${rainloop_version}/rainloop-community-${rainloop_version}.zip.asc
|
||||
sudo wget -q https://repository.rainloop.net/RainLoop.asc
|
||||
# Verify the integrity of sources
|
||||
sudo gpg --import --quiet RainLoop.asc
|
||||
sudo gpg --verify --quiet rainloop-community-${rainloop_version}.zip.asc rainloop-community-${rainloop_version}.zip
|
||||
sudo gpg --batch --delete-key --yes Rainloop
|
||||
# Unzip and overwrite
|
||||
sudo unzip -qq -o rainloop-community-${rainloop_version}.zip -d $rainloop_path/
|
||||
|
||||
# Update ynh plugins:
|
||||
sudo mkdir -p $rainloop_path/data/_data_/_default_/plugins
|
||||
sudo cp -rf ../sources/plugins/auto-domain-grab $rainloop_path/data/_data_/_default_/plugins/.
|
||||
sudo cp -rf ../sources/plugins/ynh-login-mapping $rainloop_path/data/_data_/_default_/plugins/.
|
||||
sudo cp -rf ../sources/plugins/ynh-ldap-suggestions $rainloop_path/data/_data_/_default_/plugins/.
|
||||
|
||||
# update SSO and auto version
|
||||
if [ $final_path == $rainloop_path ]
|
||||
then
|
||||
# use modified version of master index.php that implement sso
|
||||
sudo cp ../sources/sso/index.php $final_path/index.php
|
||||
else
|
||||
# use only sso on master
|
||||
sudo cp ../sources/sso/sso.php $final_path/index.php
|
||||
sudo cp ../sources/patch/index_auto_version.php $rainloop_path/index.php
|
||||
fi
|
||||
# update SSO
|
||||
sudo cp ../sources/sso/sso.php $final_path/index.php
|
||||
sudo sed -i "s@domain.tld@$domain@g" $final_path/index.php
|
||||
sudo sed -i "s@PATHTOCHANGE@$path@g" $final_path/index.php
|
||||
|
||||
# Install PGPback by chtixof to allow users to backup/restore their PGP private keys on the server
|
||||
sudo cp -rf ../sources/pgpback $final_path/.
|
||||
|
||||
# Set permissions to rainloop directory
|
||||
sudo find $final_path/. -type d -exec chmod 755 {} \;
|
||||
sudo find $final_path/. -type f -exec chmod 644 {} \;
|
||||
sudo chown -R www-data:www-data $final_path
|
||||
|
||||
# Update Nginx configuration file
|
||||
|
@ -60,7 +88,6 @@ app=rainloop
|
|||
sudo chown root: $finalphpconf
|
||||
sudo chmod 644 $finalphpconf
|
||||
|
||||
# Reload Nginx and regenerate SSOwat conf
|
||||
sudo service php5-fpm reload
|
||||
sudo service nginx reload
|
||||
sudo yunohost app ssowatconf
|
||||
# Reload services
|
||||
sudo service php5-fpm restart || true
|
||||
sudo service nginx reload || true
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
<?php
|
||||
if (!defined('APP_VERSION')) {
|
||||
$version = file_get_contents('/var/www/rainloop/app/data/VERSION');
|
||||
if ($version) {
|
||||
define('APP_VERSION', $version);
|
||||
define('APP_INDEX_ROOT_FILE', __FILE__);
|
||||
define('APP_INDEX_ROOT_PATH', str_replace('\\', '/', rtrim(dirname(__FILE__), '\\/').'/'));
|
||||
}
|
||||
}
|
||||
|
||||
if (file_exists(APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/include.php')) {
|
||||
include APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/include.php';
|
||||
} else {
|
||||
echo '[105] Missing version directory';
|
||||
exit(105);
|
||||
}
|
||||
|
||||
?>
|
23
sources/pgpback/fav.php
Normal file
23
sources/pgpback/fav.php
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
$text=file_get_contents('php://input');
|
||||
$user=$_SERVER["PHP_AUTH_USER"];
|
||||
$file='keys/pk_'.$user.'.json';
|
||||
if ($user=="") {
|
||||
$out='{"rc":-2,"pk":[]}';
|
||||
|
||||
} else if ($text=="") {
|
||||
$fread=file_get_contents($file);
|
||||
if ($fread==""){
|
||||
$out='{"rc":-3,"pk":[]}';
|
||||
} else {
|
||||
$out='{"rc":-1,"pk":'.file_get_contents($file).'}';
|
||||
}
|
||||
} else {
|
||||
$fstatus=file_put_contents($file,$text) ;
|
||||
$out='{"rc":'.$fstatus.',"pk":[]}';
|
||||
}
|
||||
header("Cache-Control: no-cache, must-revalidate");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Content-Type: application/json; charset=utf-8");
|
||||
echo json_encode($out);
|
||||
?>
|
90
sources/pgpback/index.html
Normal file
90
sources/pgpback/index.html
Normal file
|
@ -0,0 +1,90 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>PGPBack
|
||||
</title>
|
||||
<style>
|
||||
body {
|
||||
background: #41444f;
|
||||
color: #bbb;
|
||||
}
|
||||
a {
|
||||
color: #fff;
|
||||
text-decoration:none;
|
||||
}
|
||||
a:hover {
|
||||
color: #fff;
|
||||
text-decoration:underline;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>PGPBack : OpenPGP keys backup for Rainloop</h1>
|
||||
PGPBack has been tested with Chrome. It enables the following:<br><br>
|
||||
<a id="arestorels" href="javascript:void(0)">Set the local OpenPGP keys from the server</a><br/><br/>
|
||||
<a id="asavels" href="javascript:void(0)">Backup the local OpenPGP keys onto the server</a><br/><br/>
|
||||
<a id="aclearls" href="javascript:void(0)">Clear the local OpenPGP keys (for security reasons)</a><br/><br/>
|
||||
<script src="lib/jquery-1.11.2.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#asavels').click(function() {
|
||||
if (confirm('The local OpenPGP keys will be loaded onto the server')) {
|
||||
$.ajax("fav.php", {
|
||||
data : JSON.stringify([localStorage["openpgp-private-keys"],localStorage["openpgp-public-keys"]]),
|
||||
contentType : 'application/json',
|
||||
type : 'POST',
|
||||
dataType: 'json',
|
||||
success: function (data) {
|
||||
parseddata=JSON.parse(data);
|
||||
switch (parseddata.rc){
|
||||
case -2:
|
||||
alert("User not logged in Yunohost. Keys not saved.");
|
||||
break;
|
||||
case -1:
|
||||
case -3:
|
||||
alert("No keys to save.");
|
||||
break;
|
||||
case 0:
|
||||
alert("Problem when writing the data. Keys not saved.");
|
||||
break;
|
||||
default:
|
||||
alert("Keys saved ("+parseddata.rc+" bytes).");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
$('#aclearls').click(function() {
|
||||
if (confirm('The local OpenPGP keys will be deleted')) {
|
||||
delete localStorage["openpgp-private-keys"];
|
||||
delete localStorage["openpgp-public-keys"];
|
||||
}
|
||||
});
|
||||
$('#arestorels').click(function() {
|
||||
if (confirm('The local OpenPGP keys will be replaced by those from the server')) {
|
||||
$.ajax("fav.php", {
|
||||
contentType : 'application/json',
|
||||
type : 'POST',
|
||||
dataType: 'json',
|
||||
success: function (data) {
|
||||
parseddata=JSON.parse(data);
|
||||
switch (parseddata.rc){
|
||||
case -2:
|
||||
alert("User not logged in Yunohost. Keys not set.");
|
||||
break;
|
||||
case -3:
|
||||
alert("No data found. Keys not set.");
|
||||
break;
|
||||
default:
|
||||
localStorage["openpgp-private-keys"]=parseddata.pk[0];
|
||||
localStorage["openpgp-public-keys"]=parseddata.pk[1];
|
||||
alert("Keys set from the server.");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
4
sources/pgpback/lib/jquery-1.11.2.min.js
vendored
Normal file
4
sources/pgpback/lib/jquery-1.11.2.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
27
sources/plugins/auto-domain-grab/LICENSE
Normal file
27
sources/plugins/auto-domain-grab/LICENSE
Normal file
|
@ -0,0 +1,27 @@
|
|||
This plugin, written by https://github.com/jas8522
|
||||
and optimised by
|
||||
https://github.com/rhyswilliamsza
|
||||
https://github.com/rhysit
|
||||
https://github.com/RainLoop
|
||||
is released under:
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 https://github.com/jas8522
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
14
sources/plugins/auto-domain-grab/README
Normal file
14
sources/plugins/auto-domain-grab/README
Normal file
|
@ -0,0 +1,14 @@
|
|||
What is it?
|
||||
|
||||
In essense, this plugin allows for multiple users across multiple servers to use one RainLoop installation,
|
||||
all without the administrator needing to create each domain separately. This plugin detects the required
|
||||
hostname from the inputted email address (for example, it would detect "example.com" as the hostname if
|
||||
"info@example.com" is inputted). This hostname is then used for IMAP and SMTP communication.
|
||||
|
||||
How to Use:
|
||||
|
||||
1) Activate plugin
|
||||
2) Visit Settings, and add a new wildcard domain "*"
|
||||
3) Set your ports/ssl requirements as needed. These will not be changed by the plugin.
|
||||
4) In the SMTP and/or IMAP host fields, place the single word "auto". This will be replaced when the plugin is active.
|
||||
5) That's it! The plugin should now work!
|
1
sources/plugins/auto-domain-grab/VERSION
Normal file
1
sources/plugins/auto-domain-grab/VERSION
Normal file
|
@ -0,0 +1 @@
|
|||
1.1
|
56
sources/plugins/auto-domain-grab/index.php
Normal file
56
sources/plugins/auto-domain-grab/index.php
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This plug-in automatically detects the IMAP and SMTP settings by extracting them from the email address itself.
|
||||
* For example, user inputs: "info@example.com"
|
||||
* This plugin sets the IMAP and SMTP host to "example.com" upon login, and then connects to it.
|
||||
*
|
||||
* Based on:
|
||||
* https://github.com/RainLoop/rainloop-webmail/blob/master/plugins/override-smtp-credentials/index.php
|
||||
*
|
||||
*/
|
||||
|
||||
class AutoDomainGrabPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||
{
|
||||
public function Init()
|
||||
{
|
||||
$this->addHook('filter.smtp-credentials', 'FilterSmtpCredentials');
|
||||
$this->addHook('filter.imap-credentials', 'FilterImapCredentials');
|
||||
}
|
||||
|
||||
/**
|
||||
* This function detects the IMAP Host, and if it is set to "auto", replaces it with the email domain.
|
||||
*
|
||||
* @param \RainLoop\Model\Account $oAccount
|
||||
* @param array $aImapCredentials
|
||||
*/
|
||||
public function FilterImapCredentials($oAccount, &$aImapCredentials)
|
||||
{
|
||||
if ($oAccount instanceof \RainLoop\Model\Account && \is_array($aImapCredentials))
|
||||
{
|
||||
// Check for mail.$DOMAIN as entered value in RL settings
|
||||
if (!empty($aImapCredentials['Host']) && 'auto' === $aImapCredentials['Host'])
|
||||
{
|
||||
$aImapCredentials['Host'] = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function detects the SMTP Host, and if it is set to "auto", replaces it with the email domain.
|
||||
*
|
||||
* @param \RainLoop\Model\Account $oAccount
|
||||
* @param array $aSmtpCredentials
|
||||
*/
|
||||
public function FilterSmtpCredentials($oAccount, &$aSmtpCredentials)
|
||||
{
|
||||
if ($oAccount instanceof \RainLoop\Model\Account && \is_array($aSmtpCredentials))
|
||||
{
|
||||
// Check for mail.$DOMAIN as entered value in RL settings
|
||||
if (!empty($aSmtpCredentials['Host']) && 'auto' === $aSmtpCredentials['Host'])
|
||||
{
|
||||
$aSmtpCredentials['Host'] = \MailSo\Base\Utils::GetDomainFromEmail($oAccount->Email());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Loading…
Reference in a new issue