From 30b7bb91e0da900cb4605ddc735966699d0f3c2b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:24:27 +0100 Subject: [PATCH 01/26] fix --- check_process | 28 ++++++----- conf/app.src | 5 +- conf/config-sample.php | 97 ++++++++++++++++++++++++++++++++++++ conf/config.php | 93 ----------------------------------- conf/nginx.conf | 6 --- conf/php-fpm.conf | 108 +++++++++++++++++++++++++---------------- doc/DESCRIPTION.md | 1 + doc/DISCLAIMER.md | 0 manifest.json | 24 +++++---- scripts/_common.sh | 2 +- scripts/backup | 2 +- scripts/install | 61 ++++++++++++----------- scripts/remove | 20 ++++---- scripts/restore | 44 +++++++++-------- scripts/upgrade | 99 ++++++++++++------------------------- 15 files changed, 296 insertions(+), 294 deletions(-) create mode 100644 conf/config-sample.php delete mode 100644 conf/config.php create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md diff --git a/check_process b/check_process index 432896c..ac78f5c 100644 --- a/check_process +++ b/check_process @@ -1,25 +1,27 @@ -# See here for more informations -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) + domain="domain.tld" + path="/path" + admin="john" + language="fr" + is_public=1 + password="1Strong-Password" ; Checks pkg_linter=1 setup_sub_dir=1 setup_root=1 setup_nourl=0 - setup_private=0 + setup_private=1 setup_public=1 upgrade=1 + #upgrade=1 from_commit=CommitHash backup_restore=1 multi_instance=1 - port_already_use=0 - change_url=0 + change_url=1 ;;; Options -Email=anmol@datamol.org -Notification=change +Email= +Notification=none +;;; Upgrade options + ; commit=CommitHash + name=Name and date of the commit. + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& diff --git a/conf/app.src b/conf/app.src index 41cb246..8d2504e 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,6 +1,5 @@ -SOURCE_URL=https://github.com/YOURLS/YOURLS/archive/1.8.1.zip -SOURCE_SUM=c67eb7bf717de677d8a03d8be2cc0a505810252a75bcc00c3d6717c4d0ad7123 +SOURCE_URL=https://github.com/YOURLS/YOURLS/archive/1.8.2.zip +SOURCE_SUM=155e3e223b698bd3d0ab3f90d988b51c74f727fd46db144ca950a693d5dedba6 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/conf/config-sample.php b/conf/config-sample.php new file mode 100644 index 0000000..2d99f9f --- /dev/null +++ b/conf/config-sample.php @@ -0,0 +1,97 @@ + 'password', + // 'username2' => 'password2', + // You can have one or more 'login'=>'password' lines +]; + +/** URL shortening method: either 36 or 62 + ** 36: generates all lowercase keywords (ie: 13jkm) + ** 62: generates mixed case keywords (ie: 13jKm or 13JKm) + ** For more information, see https://yourls.org/urlconvert */ +define( 'YOURLS_URL_CONVERT', 36 ); + +/** Debug mode to output some internal information + ** Default is false for live site. Enable when coding or before submitting a new issue */ +define( 'YOURLS_DEBUG', false ); + +/** +* Reserved keywords (so that generated URLs won't match them) +* Define here negative, unwanted or potentially misleading keywords. +*/ +$yourls_reserved_URL = [ + 'porn', 'faggot', 'sex', 'nigger', 'fuck', 'cunt', 'dick', +]; + +/* + ** Personal settings would go after here. + */ + +//define( 'LDAPAUTH_HOST', 'localhost' ); +//define( 'LDAPAUTH_PORT', '389' ); +//define( 'LDAPAUTH_BASE', 'dc=yunohost,dc=org' ); +//define( 'LDAPAUTH_USERNAME_FIELD', 'uid'); +//require_once(dirname(__DIR__) . '/includes/functions-auth.php'); diff --git a/conf/config.php b/conf/config.php deleted file mode 100644 index 503af1a..0000000 --- a/conf/config.php +++ /dev/null @@ -1,93 +0,0 @@ -}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %T: time the log has been written (the request has finished) ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %u: remote user ; ; Default: "%R - %u %t \"%m %r\" %s" ;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - + ; The log file for slow requests ; Default Value: not set ; Note: slowlog is mandatory if request_slowlog_timeout is set -slowlog = /var/log/nginx/__NAMETOCHANGE__.slow.log - +;slowlog = log/$pool.log.slow + ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to the 'slowlog' file. A value of '0s' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 -request_slowlog_timeout = 5s - +;request_slowlog_timeout = 0 + ; The timeout for serving a single request after which the worker process will ; be killed. This option should be used when the 'max_execution_time' ini option ; does not stop script execution for some reason. A value of '0' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 request_terminate_timeout = 1d - + ; Set open file descriptor rlimit. ; Default Value: system defined value ;rlimit_files = 1024 - + ; Set max core size rlimit. ; Possible Values: 'unlimited' or an integer greater or equal to 0 ; Default Value: system defined value ;rlimit_core = 0 - + ; Chroot to this directory at the start. This value must be defined as an ; absolute path. When this value is not set, chroot is not used. ; Note: you can prefix with '$prefix' to chroot to the pool prefix or one ; of its subdirectories. If the pool prefix is not set, the global prefix ; will be used instead. -; Note: chrooting is a great security feature and should be used whenever +; Note: chrooting is a great security feature and should be used whenever ; possible. However, all PHP paths will be relative to the chroot ; (error_log, sessions.save_path, ...). ; Default Value: not set @@ -347,16 +365,25 @@ chdir = __FINALPATH__ ; Note: on highloaded environement, this can cause some delay in the page ; process time (several ms). ; Default Value: no -catch_workers_output = yes +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no ; Limits the extensions of the main script FPM will allow to parse. This can ; prevent configuration mistakes on the web server side. You should only limit ; FPM to .php extensions to prevent malicious users to use other extensions to -; exectute php code. +; execute php code. ; Note: set an empty value to allow all extensions. ; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 - +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from ; the current environment. ; Default Value: clean env @@ -370,7 +397,7 @@ catch_workers_output = yes ; overwrite the values previously defined in the php.ini. The directives are the ; same as the PHP SAPI: ; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. +; be overwritten from PHP call 'ini_set'. ; php_admin_value/php_admin_flag - these directives won't be overwritten by ; PHP call 'ini_set' ; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. @@ -391,14 +418,13 @@ catch_workers_output = yes ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M - ; Common values to change to increase file upload limit -; upload_max_filesize = 50M -; post_max_size = 50M -; mail.add_x_header = Off +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off ; Other common parameters -; max_execution_time = 600 -; max_input_time = 300 -; memory_limit = 256M -; short_open_tag = On +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +; php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..0098504 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). \ No newline at end of file diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..e69de29 diff --git a/manifest.json b/manifest.json index 409a9aa..aba71e0 100644 --- a/manifest.json +++ b/manifest.json @@ -6,22 +6,30 @@ "en": "URL shortening service", "fr": "Service de raccourcisseur d'URL" }, - "version": "1.8.1~ynh1", - "url": "https://github.com/YOURLS/YOURLS", + "version": "1.8.2~ynh1", + "url": "https://yourls.org/", "license": "MIT", + "upstream": { + "license": "MIT", + "website": "https://yourls.org/", + "demo": "https://yourls.org/cookie+", + "admindoc": "https://yunohost.org/packaging_apps", + "userdoc": "https://yunohost.org/apps", + "code": "ttps://github.com/YOURLS/YOURLS" + }, "maintainer": { "name": "Anmol Sharma", "email": "anmol@datamol.org", "url": "" }, - "requirements": { - "yunohost": ">= 4.1.7" - }, "previous_maintainers": { "name": "courgette", "email": "courgette@farcie.fr", "url": "http://thomaslebeau.fr" }, + "requirements": { + "yunohost": ">= 4.3.0" + }, "multi_instance": true, "services": [ "nginx", @@ -32,8 +40,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "domain.org" + "type": "domain" }, { "name": "path", @@ -43,8 +50,7 @@ }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" } ] } diff --git a/scripts/_common.sh b/scripts/_common.sh index 168a47a..4905daf 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ YNH_PHP_VERSION="7.3" # dependencies used by the app -extra_php_dependencies="php${YNH_PHP_VERSION}-gmp php${YNH_PHP_VERSION}-bcmath php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-xml php-pear" +pkg_dependencies="php${YNH_PHP_VERSION}-gmp php${YNH_PHP_VERSION}-bcmath php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-xml php-pear" #================================================= # PERSONAL HELPERS diff --git a/scripts/backup b/scripts/backup index fe1f3d0..742dee5 100644 --- a/scripts/backup +++ b/scripts/backup @@ -63,4 +63,4 @@ ynh_mysql_dump_db --database="$db_name" > db.sql # END OF SCRIPT #================================================= -ynh_print_info --message="Backup script completed for YOURLS. (YunoHost will then actually copy those files to the archive)." +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/install b/scripts/install index 5a3de2d..d123fa0 100644 --- a/scripts/install +++ b/scripts/install @@ -26,6 +26,7 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN +random=$(ynh_string_random 24) app=$YNH_APP_INSTANCE_NAME @@ -49,6 +50,21 @@ ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=1 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # CREATE A MYSQL DATABASE #================================================= @@ -68,21 +84,18 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= ynh_script_progression --message="Configuring NGINX web server..." --weight=2 +# Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=1 - -# Create a system user -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= @@ -96,31 +109,20 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) cp ../conf/index.php $final_path/ #================================================= -# MODIFY A CONFIG FILE #================================================= - -cp ../conf/config.php $final_path/user/config.php - -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url%/}" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__RANDOM__" --replace_string="$(ynh_string_random 24)" --target_file="$final_path/user/config.php" - -# Calculate and store the config file checksum into the app settings -ynh_store_file_checksum "$final_path/user/config.php" - -#================================================= -# SECURE FILES AND DIRECTORIES +# ADD A CONFIGURATION #================================================= +ynh_script_progression --message="Adding a configuration file..." --weight=1 -chown -R $app: $final_path -chmod 600 $final_path/user/config.php +ynh_add_config --template="../conf/config-sample.php" --destination="$final_path/user/config.php" + +chmod 600 "$final_path/user/config.php" +chown $app:$app "$final_path/user/config.php" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." --time --weight=1 +ynh_script_progression --message="Configuring permissions..." --weight=1 # unprotected_uris allows SSO credentials to be passed anyway. ynh_permission_update --permission="main" --add="visitors" @@ -138,12 +140,13 @@ ynh_local_curl "admin/install.php" "install=dummy" sleep 10 #================================================= -# SETUP SSOWAT +# RELOAD NGINX #================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= - -ynh_script_progression --message="Installation of YOURLS completed" --last +$app completed" --last diff --git a/scripts/remove b/scripts/remove index 010c3f0..fa395fb 100644 --- a/scripts/remove +++ b/scripts/remove @@ -18,6 +18,7 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= @@ -31,14 +32,7 @@ ynh_mysql_remove_db --db_user=$db_user --db_name=$db_name #================================================= # REMOVE APP MAIN DIR #================================================= - -# Remove the protected_urls -python3 $final_path/remove_sso_conf.py - -#================================================= -# REMOVE APP MAIN DIR -#================================================= -ynh_script_progression --message="Removing YOURLS main directory..." --weight=4 +ynh_script_progression --message="Removing app main directory..." --weight=4 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -59,6 +53,14 @@ ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=2 # Remove the dedicated PHP-FPM config ynh_remove_fpm_config +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --weight=1 + +# Remove metapackage and its dependencies +ynh_remove_app_dependencies + #================================================= # GENERIC FINALIZATION #================================================= @@ -73,4 +75,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of YOURLS completed" --last +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index 0b3848f..58eae03 100644 --- a/scripts/restore +++ b/scripts/restore @@ -38,19 +38,25 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Restoring the NGINX configuration..." --weight=1 ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -58,21 +64,9 @@ ynh_script_progression --message="Restoring YOURLS main directory..." --weight=3 ynh_restore_file --origin_path="$final_path" -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app - -#================================================= -# RESTORE USER RIGHTS -#================================================= - -# Restore permissions on app files -chown -R $app: $final_path -chmod 600 $final_path/user/config.php +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # RESTORE THE PHP-FPM CONFIGURATION @@ -81,6 +75,16 @@ ynh_script_progression --message="Reconfiguring PHP-FPM..." --weight=10 ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +#================================================= +# SPECIFIC RESTORATION +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies + #================================================= # RESTORE THE MYSQL DATABASE #================================================= @@ -104,4 +108,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for YOURLS" --last +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 3c98e9b..aef78a7 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -29,6 +29,20 @@ phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) upgrade_type=$(ynh_check_app_version_changed) +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up YOURLS before upgrading (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= @@ -53,97 +67,44 @@ if ynh_legacy_permissions_exists; then fi #================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +# CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Backing up YOURLS before upgrading (may take a while)..." --weight=1 +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" -#================================================= -# STANDARD UPGRADE STEPS #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -# Download, check integrity, uncompress and patch the source from app.src -# Create a temporary directory along with /user/plugin sub directory in it -tmpdir="$(mktemp -d)" -mkdir -p "$tmpdir/user/" -# Backup the app files in the temp dir -cp -a "$final_path/index.php" "$tmpdir" -cp -a "$final_path/.htaccess" "$tmpdir" -cp -a "$final_path/user/config.php" "$tmpdir/user" +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading source files..." --weight=1 -# Remove the app directory securely -ynh_secure_remove --file="$final_path" + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" --keep="$final_path/user/config.php" +fi -# Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source --dest_dir="$final_path" - -# Copy the app files from tmp to final_path -cp -a "$tmpdir/index.php" "$final_path" -cp -a "$tmpdir/.htaccess" "$final_path" -cp -a "$tmpdir/user/config.php" "$final_path/user" - -#remove tmp dir -ynh_secure_remove "$tmpdir" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # NGINX CONFIGURATION #================================================= ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 +# Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=3 - -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app - #================================================= # PHP-FPM CONFIGURATION #================================================= ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=4 # Create a dedicated PHP-FPM config -ynh_add_fpm_config --package="$extra_php_dependencies" - -#================================================= -# MODIFY A CONFIG FILE -#================================================= -ynh_script_progression --message="Modifying a config file..." --weight=2 - -# Verify the checksum and backup the file if it's different -ynh_backup_if_checksum_is_different --file="$final_path/user/config.php" - -cp ../conf/config.php $final_path/user/config.php - -ynh_replace_string --match_string="__DB_NAME__" --replace_string="$db_name" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__DB_PWD__" --replace_string="$db_pwd" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__DOMAIN__" --replace_string="$domain" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__PATH__" --replace_string="${path_url%/}" --target_file="$final_path/user/config.php" -ynh_replace_string --match_string="__RANDOM__" --replace_string="$(ynh_string_random 24)" --target_file="$final_path/user/config.php" - -# Recalculate and store the config file checksum into the app settings -ynh_store_file_checksum --file="$final_path/user/config.php" - -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= - -# Restore permissions on app files -chown -R $app: $final_path -chmod 600 $final_path/user/config.php +ynh_add_fpm_config #================================================= # RELOAD NGINX @@ -156,4 +117,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of YOURLS completed" --last +ynh_script_progression --message="Upgrade of $app completed" --last From bcedf13f348a358886f1f2ac442aecea1039a45a Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 26 Feb 2022 19:24:34 +0000 Subject: [PATCH 02/26] Auto-update README --- README.md | 67 +++++++++++++++----------------------------------- README_fr.md | 69 +++++++++++++++------------------------------------- 2 files changed, 39 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 3d877df..64df7bd 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,34 @@ -# YOURLS for YunoHost + + +# Yourls for YunoHost [![Integration level](https://dash.yunohost.org/integration/yourls.svg)](https://dash.yunohost.org/appci/app/yourls) ![](https://ci-apps.yunohost.org/ci/badges/yourls.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/yourls.maintain.svg) -[![Install YOURLS with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=yourls) +[![Install Yourls with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=yourls) *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install YOURLS quickly and simply on a YunoHost server. +> *This package allows you to install Yourls quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview + YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). -**Shipped version:** 1.8.1 +**Shipped version:** 1.8.2~ynh1 -## Screenshots +**Demo:** https://yourls.org/cookie+ -![](https://yourls.org/images/stats-anim.gif) +## Documentation and resources -## Demo - -* [Official demo](https://yourls.org/cookie+) - -## Configuration - -How to configure this app: From an admin panel, a plain file with SSH, or any other way. - -## Documentation - - * Official documentation: Link to the official documentation of this app - * YunoHost documentation: If specific documentation is needed, feel free to contribute. - -## YunoHost specific features - -#### Multi-user support - - * Are LDAP and HTTP auth supported? - * Can the app be used by multiple users? - -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/yourls%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/yourls/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/yourls%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/yourls/) - -## Limitations - -* Any known limitations. - -## Additional information - -* Other info you would like to add about this app. - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/yourls_ynh/issues - * App website: https://yourls.org/ - * Upstream app repository: https://github.com/YOURLS/YOURLS - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: https://yourls.org/ +* Official user documentation: https://yunohost.org/apps +* Official admin documentation: https://yunohost.org/packaging_apps +* Upstream app code repository: ttps://github.com/YOURLS/YOURLS +* YunoHost documentation for this app: https://yunohost.org/app_yourls +* Report a bug: https://github.com/YunoHost-Apps/yourls_ynh/issues ## Developer info @@ -69,3 +40,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/yourls_ynh/tree/testi or sudo yunohost app upgrade yourls -u https://github.com/YunoHost-Apps/yourls_ynh/tree/testing --debug ``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md index 91cc124..c1a35c1 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,63 +1,30 @@ -# YOURLS pour YunoHost +# Yourls pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/yourls.svg)](https://dash.yunohost.org/appci/app/yourls) ![](https://ci-apps.yunohost.org/ci/badges/yourls.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/yourls.maintain.svg) -[![Installer YOURLS avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=yourls) +[![Installer Yourls avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=yourls) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer YOURLS rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* +> *Ce package vous permet d'installer Yourls rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* ## Vue d'ensemble -YOURLS signifie Your Own URL Shortener. C'est un petit ensemble de scripts PHP qui vous permettront d'exécuter votre propre service de raccourcissement d'URL (à la TinyURL ou bitly). -**Version incluse :** 1.8.1 +YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). -## Captures d'écran +**Version incluse :** 1.8.2~ynh1 -![](https://yourls.org/images/stats-anim.gif) +**Démo :** https://yourls.org/cookie+ -## Démo +## Documentations et ressources -* [Official demo](https://yourls.org/cookie+) - -## Configuration - -How to configure this app: From an admin panel, a plain file with SSH, or any other way. - -## Documentation - - * Documentation officielle : Lien vers la documentation officielle de cette application. - * Documentation YunoHost : Si une documentation spécifique est nécessaire, n'hésitez pas à contribuer. - -## Caractéristiques spécifiques YunoHost - -#### Support multi-utilisateur - -* L'authentification LDAP et HTTP est-elle prise en charge ? -* L'application peut-elle être utilisée par plusieurs utilisateurs ? - -#### Architectures supportées - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/yourls%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/yourls/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/yourls%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/yourls/) - -## Limitations - -* Limitations connues. - -## Informations additionnelles - -* Autres informations que vous souhaitez ajouter sur cette application. - -## Links - - * Signaler un bug : https://github.com/YunoHost-Apps/yourls_ynh/issues - * Site de l'application : https://yourls.org/ - * Dépôt de l'application principale : https://github.com/YOURLS/YOURLS - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://yourls.org/ +* Documentation officielle utilisateur : https://yunohost.org/apps +* Documentation officielle de l'admin : https://yunohost.org/packaging_apps +* Dépôt de code officiel de l'app : ttps://github.com/YOURLS/YOURLS +* Documentation YunoHost pour cette app : https://yunohost.org/app_yourls +* Signaler un bug : https://github.com/YunoHost-Apps/yourls_ynh/issues ## Informations pour les développeurs @@ -66,6 +33,8 @@ Merci de faire vos pull request sur la [branche testing](https://github.com/Yuno Pour essayer la branche testing, procédez comme suit. ``` sudo yunohost app install https://github.com/YunoHost-Apps/yourls_ynh/tree/testing --debug -or +ou sudo yunohost app upgrade yourls -u https://github.com/YunoHost-Apps/yourls_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 48d18f1bf60922a7a5c4c36a930784c95026174b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:26:50 +0100 Subject: [PATCH 03/26] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index d123fa0..b9cae4a 100644 --- a/scripts/install +++ b/scripts/install @@ -102,7 +102,7 @@ ynh_add_nginx_config ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 # Create a dedicated php-fpm config -ynh_add_fpm_config --package="$extra_php_dependencies" +ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) # copy index file From 26314eacc3d2824972428196fbdaaa030339ff80 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:28:14 +0100 Subject: [PATCH 04/26] Update install --- scripts/install | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index b9cae4a..5b17dc6 100644 --- a/scripts/install +++ b/scripts/install @@ -130,14 +130,14 @@ ynh_permission_update --permission="main" --add="visitors" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=3 +#ynh_script_progression --message="Reloading NGINX web server..." --weight=3 -ynh_systemd_action --service_name=nginx --action=reload -sleep 10 +#ynh_systemd_action --service_name=nginx --action=reload +#sleep 10 # Start YOURLS install (database table creation) -ynh_local_curl "admin/install.php" "install=dummy" -sleep 10 +#ynh_local_curl "admin/install.php" "install=dummy" +#sleep 10 #================================================= # RELOAD NGINX From f2334d815174c7ddfde6605bfff26963a7614a70 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:29:37 +0100 Subject: [PATCH 05/26] Update config-sample.php --- conf/config-sample.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/conf/config-sample.php b/conf/config-sample.php index 2d99f9f..e69d1ca 100644 --- a/conf/config-sample.php +++ b/conf/config-sample.php @@ -89,9 +89,3 @@ $yourls_reserved_URL = [ /* ** Personal settings would go after here. */ - -//define( 'LDAPAUTH_HOST', 'localhost' ); -//define( 'LDAPAUTH_PORT', '389' ); -//define( 'LDAPAUTH_BASE', 'dc=yunohost,dc=org' ); -//define( 'LDAPAUTH_USERNAME_FIELD', 'uid'); -//require_once(dirname(__DIR__) . '/includes/functions-auth.php'); From 734b863fdd29c957ed74b058d54a77da1b98d768 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:31:18 +0100 Subject: [PATCH 06/26] Update install --- scripts/install | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 5b17dc6..ba11ac0 100644 --- a/scripts/install +++ b/scripts/install @@ -149,4 +149,5 @@ ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= -$app completed" --last + +ynh_script_progression --message="Installation of $app completed" --last From 1aebdeff191b58f9e64f6f0a08d5203795f5e1c7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:35:40 +0100 Subject: [PATCH 07/26] Fix --- conf/activate_plugins.sql | 3 --- conf/nginx.conf | 21 +++++++++++---------- conf/remove_sso_conf.py | 8 -------- scripts/install | 20 ++++++++++++-------- 4 files changed, 23 insertions(+), 29 deletions(-) delete mode 100644 conf/activate_plugins.sql delete mode 100644 conf/remove_sso_conf.py diff --git a/conf/activate_plugins.sql b/conf/activate_plugins.sql deleted file mode 100644 index 93ea301..0000000 --- a/conf/activate_plugins.sql +++ /dev/null @@ -1,3 +0,0 @@ -INSERT INTO `yourls_options` ( `option_name`, `option_value`) VALUES -('active_plugins', 'a:1:{i:0;s:29:"yourls-ldap-plugin/plugin.php";}'); - diff --git a/conf/nginx.conf b/conf/nginx.conf index 8feb87d..c9a86e3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,20 +1,21 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { - + + # Path to source alias __FINALPATH__/; - try_files $uri $uri/ __FINALPATH__/yourls-loader.php; - index index.php index.html index.htm; + try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { - fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php__PHPVERSION__-fpm-__NAME__.sock; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param REMOTE_USER $remote_user; - fastcgi_param PATH_INFO $fastcgi_path_info; - fastcgi_param SCRIPT_FILENAME $request_filename; + fastcgi_split_path_info ^(.+?\.php)(/.*)$; + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param SCRIPT_FILENAME $request_filename; } # Include SSOWAT user panel. diff --git a/conf/remove_sso_conf.py b/conf/remove_sso_conf.py deleted file mode 100644 index 4237b7d..0000000 --- a/conf/remove_sso_conf.py +++ /dev/null @@ -1,8 +0,0 @@ -import json - -with open("/etc/ssowat/conf.json.persistent", "r", encoding='utf-8') as jsonFile: - data = json.load(jsonFile) - data["protected_urls"].remove("__DOMAIN____PATH__/admin") - -with open("/etc/ssowat/conf.json.persistent", "w", encoding='utf-8') as jsonFile: - jsonFile.write(json.dumps(data, indent=4, sort_keys=True)) diff --git a/scripts/install b/scripts/install index ba11ac0..dee95ce 100644 --- a/scripts/install +++ b/scripts/install @@ -106,7 +106,7 @@ ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) # copy index file -cp ../conf/index.php $final_path/ +#cp ../conf/index.php $final_path/ #================================================= #================================================= @@ -128,16 +128,20 @@ ynh_script_progression --message="Configuring permissions..." --weight=1 ynh_permission_update --permission="main" --add="visitors" #================================================= -# RELOAD NGINX +# SETUP APPLICATION WITH CURL #================================================= -#ynh_script_progression --message="Reloading NGINX web server..." --weight=3 -#ynh_systemd_action --service_name=nginx --action=reload -#sleep 10 +# # Set the app as temporarily public for curl call +# ynh_script_progression --message="Configuring SSOwat..." --weight=1 +# # Making the app public for curl +# ynh_permission_update --permission="main" --add="visitors" -# Start YOURLS install (database table creation) -#ynh_local_curl "admin/install.php" "install=dummy" -#sleep 10 +# # Installation with curl +# ynh_script_progression --message="Finalizing installation..." --weight=1 +# ynh_local_curl "admin/install.php" "install=dummy" + +# # Remove the public access +# ynh_permission_update --permission="main" --remove="visitors" #================================================= # RELOAD NGINX From 9d91c33fe377e8dbb42f4fc52100a8a18117fdde Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:48:10 +0100 Subject: [PATCH 08/26] fix --- conf/config-sample.php | 2 +- manifest.json | 4 ++++ scripts/_common.sh | 2 +- scripts/install | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/conf/config-sample.php b/conf/config-sample.php index e69d1ca..f11c9ea 100644 --- a/conf/config-sample.php +++ b/conf/config-sample.php @@ -63,7 +63,7 @@ define( 'YOURLS_COOKIEKEY', '__RANDOM__' ); ** YOURLS will auto encrypt plain text passwords in this file ** Read http://yourls.org/userpassword for more information */ $yourls_user_passwords = [ - 'username' => 'password', + '__ADMIN__' => '__PASSWORD__', // 'username2' => 'password2', // You can have one or more 'login'=>'password' lines ]; diff --git a/manifest.json b/manifest.json index aba71e0..d6547e7 100644 --- a/manifest.json +++ b/manifest.json @@ -51,6 +51,10 @@ { "name": "admin", "type": "user" + }, + { + "name": "password", + "type": "password" } ] } diff --git a/scripts/_common.sh b/scripts/_common.sh index 4905daf..3a502cb 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,7 +4,7 @@ # COMMON VARIABLES #================================================= -YNH_PHP_VERSION="7.3" +YNH_PHP_VERSION="7.4" # dependencies used by the app pkg_dependencies="php${YNH_PHP_VERSION}-gmp php${YNH_PHP_VERSION}-bcmath php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-xml php-pear" diff --git a/scripts/install b/scripts/install index dee95ce..d14e69c 100644 --- a/scripts/install +++ b/scripts/install @@ -26,7 +26,8 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN -random=$(ynh_string_random 24) +password=$YNH_APP_ARG_PASSWORD +random=$(ynh_string_random --length=24) app=$YNH_APP_INSTANCE_NAME From 27aa6dc7d69ce50932b4c07e071ce0cb608dfb1b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:58:51 +0100 Subject: [PATCH 09/26] Update nginx.conf --- conf/nginx.conf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index c9a86e3..0a76265 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,12 +1,13 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { - + # Path to source alias __FINALPATH__/; index index.php index.html index.htm; - try_files $uri $uri/ index.php; + try_files $uri $uri/ __PATH__/yourls-loader.php$is_args$args; + location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; From 5183e26b66882153b29d2d19488a30b8bd061360 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 21:01:11 +0100 Subject: [PATCH 10/26] Fix --- doc/screenshots/p4.png | Bin 0 -> 81181 bytes manifest.json | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 doc/screenshots/p4.png diff --git a/doc/screenshots/p4.png b/doc/screenshots/p4.png new file mode 100644 index 0000000000000000000000000000000000000000..edf80730b4c5a50c8561a85fee5d84f597d17f12 GIT binary patch literal 81181 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index d6547e7..1873f27 100644 --- a/manifest.json +++ b/manifest.json @@ -15,12 +15,11 @@ "demo": "https://yourls.org/cookie+", "admindoc": "https://yunohost.org/packaging_apps", "userdoc": "https://yunohost.org/apps", - "code": "ttps://github.com/YOURLS/YOURLS" + "code": "https://github.com/YOURLS/YOURLS" }, "maintainer": { "name": "Anmol Sharma", - "email": "anmol@datamol.org", - "url": "" + "email": "anmol@datamol.org" }, "previous_maintainers": { "name": "courgette", From 3db23f1dbc1be0473c955fa3c4abff2de98e7294 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 26 Feb 2022 20:01:17 +0000 Subject: [PATCH 11/26] Auto-update README --- README.md | 6 +++++- README_fr.md | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 64df7bd..12cc8ac 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,16 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that **Demo:** https://yourls.org/cookie+ +## Screenshots + +![](./doc/screenshots/p4.png) + ## Documentation and resources * Official app website: https://yourls.org/ * Official user documentation: https://yunohost.org/apps * Official admin documentation: https://yunohost.org/packaging_apps -* Upstream app code repository: ttps://github.com/YOURLS/YOURLS +* Upstream app code repository: https://github.com/YOURLS/YOURLS * YunoHost documentation for this app: https://yunohost.org/app_yourls * Report a bug: https://github.com/YunoHost-Apps/yourls_ynh/issues diff --git a/README_fr.md b/README_fr.md index c1a35c1..79d10cc 100644 --- a/README_fr.md +++ b/README_fr.md @@ -17,12 +17,16 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that **Démo :** https://yourls.org/cookie+ +## Captures d'écran + +![](./doc/screenshots/p4.png) + ## Documentations et ressources * Site officiel de l'app : https://yourls.org/ * Documentation officielle utilisateur : https://yunohost.org/apps * Documentation officielle de l'admin : https://yunohost.org/packaging_apps -* Dépôt de code officiel de l'app : ttps://github.com/YOURLS/YOURLS +* Dépôt de code officiel de l'app : https://github.com/YOURLS/YOURLS * Documentation YunoHost pour cette app : https://yunohost.org/app_yourls * Signaler un bug : https://github.com/YunoHost-Apps/yourls_ynh/issues From aba029036edeb668937fb9fdb2794cd1fd61929d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 21:14:01 +0100 Subject: [PATCH 12/26] Update install --- scripts/install | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/scripts/install b/scripts/install index d14e69c..5f523ff 100644 --- a/scripts/install +++ b/scripts/install @@ -107,7 +107,7 @@ ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) # copy index file -#cp ../conf/index.php $final_path/ +cp ../conf/index.php $final_path/ #================================================= #================================================= @@ -120,29 +120,18 @@ ynh_add_config --template="../conf/config-sample.php" --destination="$final_path chmod 600 "$final_path/user/config.php" chown $app:$app "$final_path/user/config.php" -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --weight=1 - -# unprotected_uris allows SSO credentials to be passed anyway. -ynh_permission_update --permission="main" --add="visitors" - #================================================= # SETUP APPLICATION WITH CURL #================================================= -# # Set the app as temporarily public for curl call -# ynh_script_progression --message="Configuring SSOwat..." --weight=1 -# # Making the app public for curl -# ynh_permission_update --permission="main" --add="visitors" +# Set the app as temporarily public for curl call +ynh_script_progression --message="Configuring SSOwat..." --weight=1 +# Making the app public for curl +ynh_permission_update --permission="main" --add="visitors" -# # Installation with curl -# ynh_script_progression --message="Finalizing installation..." --weight=1 -# ynh_local_curl "admin/install.php" "install=dummy" - -# # Remove the public access -# ynh_permission_update --permission="main" --remove="visitors" +# Installation with curl +ynh_script_progression --message="Finalizing installation..." --weight=1 +ynh_local_curl "admin/install.php" "install=dummy" #================================================= # RELOAD NGINX From 970a9c1bb2534188c3f63894467adaf7af729ba7 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 21:20:26 +0100 Subject: [PATCH 13/26] Update index.php --- conf/index.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/conf/index.php b/conf/index.php index 534cb1a..770e61e 100644 --- a/conf/index.php +++ b/conf/index.php @@ -6,12 +6,9 @@ - - +

Admin interface

+ \ No newline at end of file From 8f580a9c51ee99634d1c0b1b447e203dfcfad675 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 21:24:21 +0100 Subject: [PATCH 14/26] Fix --- doc/DESCRIPTION.md | 12 +++++++++++- scripts/install | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 0098504..3c160a3 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1 +1,11 @@ -YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). \ No newline at end of file +YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). + +### YOURLS Features + +- Free and open-source software, +- Private (your links only) or Public (everybody can create short links, fine for an intranet), +- Terrific Plugin architecture and dozens of plugins to easily implement new features, +- Handy bookmarklets to easily shorten and share links, +- Awesome stats: historical click reports, referrers tracking, visitors geo-location, +- Developer API to integrate YOURLS into other applications, +- Sample files to create your own public interface and more ! diff --git a/scripts/install b/scripts/install index 5f523ff..7ef7189 100644 --- a/scripts/install +++ b/scripts/install @@ -85,6 +85,9 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" +# copy index file +ynh_add_config --template="../conf/index.php" --destination="$final_path/" + chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" @@ -106,9 +109,6 @@ ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -# copy index file -cp ../conf/index.php $final_path/ - #================================================= #================================================= # ADD A CONFIGURATION From ec1bd24493e452a7043dffece7909cf63e1026ce Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 26 Feb 2022 20:24:31 +0000 Subject: [PATCH 15/26] Auto-update README --- README.md | 11 +++++++++++ README_fr.md | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/README.md b/README.md index 12cc8ac..27c8fbb 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,17 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). +### YOURLS Features + +- Free and open-source software, +- Private (your links only) or Public (everybody can create short links, fine for an intranet), +- Terrific Plugin architecture and dozens of plugins to easily implement new features, +- Handy bookmarklets to easily shorten and share links, +- Awesome stats: historical click reports, referrers tracking, visitors geo-location, +- Developer API to integrate YOURLS into other applications, +- Sample files to create your own public interface and more ! + + **Shipped version:** 1.8.2~ynh1 **Demo:** https://yourls.org/cookie+ diff --git a/README_fr.md b/README_fr.md index 79d10cc..5c16d1c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,6 +13,17 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or bitly). +### YOURLS Features + +- Free and open-source software, +- Private (your links only) or Public (everybody can create short links, fine for an intranet), +- Terrific Plugin architecture and dozens of plugins to easily implement new features, +- Handy bookmarklets to easily shorten and share links, +- Awesome stats: historical click reports, referrers tracking, visitors geo-location, +- Developer API to integrate YOURLS into other applications, +- Sample files to create your own public interface and more ! + + **Version incluse :** 1.8.2~ynh1 **Démo :** https://yourls.org/cookie+ From 4ac3b8e631c3b6334f659d5bf4cc5201ffe4dde6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 21:45:39 +0100 Subject: [PATCH 16/26] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 7ef7189..1a76556 100644 --- a/scripts/install +++ b/scripts/install @@ -86,7 +86,7 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path ynh_setup_source --dest_dir="$final_path" # copy index file -ynh_add_config --template="../conf/index.php" --destination="$final_path/" +cp ../conf/index.php $final_path/ chmod 750 "$final_path" chmod -R o-rwx "$final_path" From 48ad2f37c6f15e17f12c4bc0f5ca65075d419928 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 22:34:00 +0100 Subject: [PATCH 17/26] Fix --- manifest.json | 5 +++++ scripts/install | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/manifest.json b/manifest.json index 1873f27..ba1ad42 100644 --- a/manifest.json +++ b/manifest.json @@ -54,6 +54,11 @@ { "name": "password", "type": "password" + }, + { + "name": "is_public", + "type": "boolean", + "default": true } ] } diff --git a/scripts/install b/scripts/install index 1a76556..47f98a1 100644 --- a/scripts/install +++ b/scripts/install @@ -26,6 +26,7 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN +is_public=$YNH_APP_ARG_IS_PUBLIC password=$YNH_APP_ARG_PASSWORD random=$(ynh_string_random --length=24) @@ -133,6 +134,25 @@ ynh_permission_update --permission="main" --add="visitors" ynh_script_progression --message="Finalizing installation..." --weight=1 ynh_local_curl "admin/install.php" "install=dummy" +# Remove the public access +ynh_permission_update --permission="main" --remove="visitors" + +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." --time --weight=1 + +# Make app public if necessary +if [ $is_public -eq 1 ] +then + # Everyone can access the app. + # The "main" permission is automatically created before the install script. + ynh_permission_update --permission="main" --add="visitors" +fi + +# Only the admin can access the admin panel of the app (if the app has an admin panel) +ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin + #================================================= # RELOAD NGINX #================================================= From 8206972698f6c5f3e1de5bdf881ea5f1c9d89567 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 22:36:47 +0100 Subject: [PATCH 18/26] Update upgrade --- scripts/upgrade | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index aef78a7..80afde9 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -66,6 +66,11 @@ if ynh_legacy_permissions_exists; then ynh_app_setting_delete --app=$app --key=is_public fi +if ! ynh_permission_exists --permission="admin"; then + # Create the required permissions + ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin +fi + #================================================= # CREATE DEDICATED USER #================================================= From 053ae37787ba9a2f7f5caf3e7d7130ef57f6ac6b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:22:11 +0100 Subject: [PATCH 19/26] Update upgrade --- scripts/upgrade | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index 80afde9..20aecb3 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -103,6 +103,13 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - # Create a dedicated NGINX config ynh_add_nginx_config +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + #================================================= # PHP-FPM CONFIGURATION #================================================= From 19052a96b64499aefc6303e9b9a54d1fb6314d1e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:23:08 +0100 Subject: [PATCH 20/26] Update install --- scripts/install | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index 47f98a1..b5d28b3 100644 --- a/scripts/install +++ b/scripts/install @@ -27,7 +27,7 @@ domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC -password=$YNH_APP_ARG_PASSWORD +password="$YNH_APP_ARG_PASSWORD" random=$(ynh_string_random --length=24) app=$YNH_APP_INSTANCE_NAME @@ -110,7 +110,6 @@ ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 ynh_add_fpm_config phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -#================================================= #================================================= # ADD A CONFIGURATION #================================================= @@ -140,7 +139,7 @@ ynh_permission_update --permission="main" --remove="visitors" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." --time --weight=1 +ynh_script_progression --message="Configuring permissions..." --weight=1 # Make app public if necessary if [ $is_public -eq 1 ] From 4cc686959485948c931ec6ad8917ab1f1f52bfd6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:34:36 +0100 Subject: [PATCH 21/26] add change_url --- manifest.json | 3 +- scripts/change_url | 123 +++++++++++++++++++++++++++++++++++++++++++++ scripts/install | 3 +- 3 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 scripts/change_url diff --git a/manifest.json b/manifest.json index ba1ad42..d459ef5 100644 --- a/manifest.json +++ b/manifest.json @@ -13,8 +13,7 @@ "license": "MIT", "website": "https://yourls.org/", "demo": "https://yourls.org/cookie+", - "admindoc": "https://yunohost.org/packaging_apps", - "userdoc": "https://yunohost.org/apps", + "admindoc": "https://github.com/YOURLS/YOURLS/wiki", "code": "https://github.com/YOURLS/YOURLS" }, "maintainer": { diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..283ffda --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,123 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +admin=$(ynh_app_setting_get --app=$app --key=admin) +random=$(ynh_app_setting_get --app=$app --key=random) +password=$(ynh_app_setting_get --app=$app --key=password) + +#================================================= +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# ADD A CONFIGURATION +#================================================= +ynh_script_progression --message="Adding a configuration file..." --weight=1 + +domain=$new_domain +path=$new_path +ynh_add_config --template="../conf/config-sample.php" --destination="$final_path/user/config.php" + +chmod 600 "$final_path/user/config.php" +chown $app:$app "$final_path/user/config.php" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install index b5d28b3..d779000 100644 --- a/scripts/install +++ b/scripts/install @@ -51,7 +51,8 @@ ynh_script_progression --message="Storing installation settings..." --weight=1 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin - +ynh_app_setting_set --app=$app --key=random --value=$random +ynh_app_setting_set --app=$app --key=password --value="$password" #================================================= # INSTALL DEPENDENCIES #================================================= From b268bf266471e03f2dee473d22f62aa230af653f Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 27 Feb 2022 07:34:41 +0000 Subject: [PATCH 22/26] Auto-update README --- README.md | 3 +-- README_fr.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 27c8fbb..b190179 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,7 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that ## Documentation and resources * Official app website: https://yourls.org/ -* Official user documentation: https://yunohost.org/apps -* Official admin documentation: https://yunohost.org/packaging_apps +* Official admin documentation: https://github.com/YOURLS/YOURLS/wiki * Upstream app code repository: https://github.com/YOURLS/YOURLS * YunoHost documentation for this app: https://yunohost.org/app_yourls * Report a bug: https://github.com/YunoHost-Apps/yourls_ynh/issues diff --git a/README_fr.md b/README_fr.md index 5c16d1c..76e6c16 100644 --- a/README_fr.md +++ b/README_fr.md @@ -35,8 +35,7 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that ## Documentations et ressources * Site officiel de l'app : https://yourls.org/ -* Documentation officielle utilisateur : https://yunohost.org/apps -* Documentation officielle de l'admin : https://yunohost.org/packaging_apps +* Documentation officielle de l'admin : https://github.com/YOURLS/YOURLS/wiki * Dépôt de code officiel de l'app : https://github.com/YOURLS/YOURLS * Documentation YunoHost pour cette app : https://yunohost.org/app_yourls * Signaler un bug : https://github.com/YunoHost-Apps/yourls_ynh/issues From 396efe7b2eea5817f9c223f662ec15937fd56d43 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:45:14 +0100 Subject: [PATCH 23/26] Update check_process --- check_process | 1 - 1 file changed, 1 deletion(-) diff --git a/check_process b/check_process index ac78f5c..3e2a0c5 100644 --- a/check_process +++ b/check_process @@ -3,7 +3,6 @@ domain="domain.tld" path="/path" admin="john" - language="fr" is_public=1 password="1Strong-Password" ; Checks From d241d13eb565f2e6930b4632c6c957100b01feec Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:55:15 +0100 Subject: [PATCH 24/26] Update index.php --- conf/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/index.php b/conf/index.php index 770e61e..f5fc314 100644 --- a/conf/index.php +++ b/conf/index.php @@ -2,7 +2,7 @@ - + YOURLS From 4e001331490a64a8130782c5d1988dd931fbc3df Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:59:14 +0100 Subject: [PATCH 25/26] Update upgrade --- scripts/upgrade | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/upgrade b/scripts/upgrade index 20aecb3..9a316ce 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -20,6 +20,7 @@ path_url=$(ynh_app_setting_get --app=$app --key=path) admin=$(ynh_app_setting_get --app=$app --key=admin) final_path=$(ynh_app_setting_get --app=$app --key=final_path) db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) From 0938711b80c8b5cc303a22037238562be8b296d9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 08:59:48 +0100 Subject: [PATCH 26/26] Update nginx.conf --- conf/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0a76265..ba5b6dc 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -6,7 +6,7 @@ location __PATH__/ { index index.php index.html index.htm; - try_files $uri $uri/ __PATH__/yourls-loader.php$is_args$args; + try_files $uri $uri/ __PATH__/yourls-loader.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;