From 3cc9286fa3c55b0a92f63ac73b7976a3ac3c88c4 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Thu, 13 May 2021 17:54:18 +0200 Subject: [PATCH 01/57] [autopatch] Update issue and PR templates --- .github/ISSUE_TEMPLATE.md | 55 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++ 2 files changed, 71 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..2729a6b --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,55 @@ +--- +name: Bug report +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. + +--- + +**How to post a meaningful bug report** +1. *Read this whole template first.* +2. *Determine if you are on the right place:* + - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* + - *Otherwise, the issue may be due to the app itself. Refer to its documentation or repository for help.* + - *When in doubt, post here and we will figure it out together.* +3. *Delete the italic comments as you write over them below, and remove this guide.* +--- + +### Describe the bug + +*A clear and concise description of what the bug is.* + +### Context + +- Hardware: *VPS bought online / Old laptop or computer / Raspberry Pi at home / Internet Cube with VPN / Other ARM board / ...* +- YunoHost version: x.x.x +- I have access to my server: *Through SSH | through the webadmin | direct access via keyboard / screen | ...* +- Are you in a special context or did you perform some particular tweaking on your YunoHost instance?: *no / yes* + - If yes, please explain: +- Using, or trying to install package version/branch: +- If upgrading, current package version: *can be found in the admin, or with `yunohost app info $app_id`* + +### Steps to reproduce + +- *If you performed a command from the CLI, the command itself is enough. For example:* + ```sh + sudo yunohost app install the_app + ``` +- *If you used the webadmin, please perform the equivalent command from the CLI first.* +- *If the error occurs in your browser, explain what you did:* + 1. *Go to '...'* + 2. *Click on '...'* + 3. *Scroll down to '...'* + 4. *See error* + +### Expected behavior + +*A clear and concise description of what you expected to happen. You can remove this section if the command above is enough to understand your intent.* + +### Logs + +*When an operation fails, YunoHost provides a simple way to share the logs.* +- *In the webadmin, the error message contains a link to the relevant log page. On that page, you will be able to 'Share with Yunopaste'. If you missed it, the logs of previous operations are also available under Tools > Logs.* +- *In command line, the command to share the logs is displayed at the end of the operation and looks like `yunohost log display [log name] --share`. If you missed it, you can find the log ID of a previous operation using `yunohost log list`.* + +*After sharing the log, please copypaste directly the link provided by YunoHost (to help readability, no need to copypaste the entire content of the log here, just the link is enough...)* + +*If applicable and useful, add screenshots to help explain your problem.* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..ef70e18 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +## Problem + +- *Description of why you made this PR* + +## Solution + +- *And how do you fix that problem* + +## PR Status + +- [ ] Code finished and ready to be reviewed/tested +- [ ] The fix/enhancement were manually tested (if applicable) + +## Automatic tests + +Automatic tests can be triggered on https://ci-apps-dev.yunohost.org/ *after creating the PR*, by commenting "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!". (N.B. : for this to work you need to be a member of the Yunohost-Apps organization) From 30b7bb91e0da900cb4605ddc735966699d0f3c2b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 26 Feb 2022 20:24:27 +0100 Subject: [PATCH 02/57] 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 03/57] 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 04/57] 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 05/57] 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 06/57] 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 07/57] 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 08/57] 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 09/57] 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 10/57] 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 11/57] 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 12/57] 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 13/57] 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 14/57] 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 15/57] 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 16/57] 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 17/57] 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 18/57] 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 19/57] 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 20/57] 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 21/57] 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 22/57] 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 23/57] 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 24/57] 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 25/57] 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 26/57] 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 27/57] 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)(/.*)$; From 4fc5b0edd24b2e5b670d211f3e819451418332d3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:14:34 +0100 Subject: [PATCH 28/57] Fix --- conf/config-sample.php | 2 +- conf/fr.src | 5 +++++ manifest.json | 13 +++++++++---- scripts/change_url | 1 + scripts/install | 5 +++++ 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 conf/fr.src diff --git a/conf/config-sample.php b/conf/config-sample.php index f11c9ea..d3e7dc8 100644 --- a/conf/config-sample.php +++ b/conf/config-sample.php @@ -43,7 +43,7 @@ define( 'YOURLS_SITE', 'http://__DOMAIN____PATH__' ); ** Change this setting to use a translation file for your language, instead of the default English. ** That translation file (a .mo file) must be installed in the user/language directory. ** See http://yourls.org/translations for more information */ -define( 'YOURLS_LANG', '' ); +define( 'YOURLS_LANG', '__LANGUAGE__' ); /** Allow multiple short URLs for a same long URL ** Set to true to have only one pair of shortURL/longURL (default YOURLS behavior) diff --git a/conf/fr.src b/conf/fr.src new file mode 100644 index 0000000..58eb1b6 --- /dev/null +++ b/conf/fr.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/ozh/YOURLS-fr_FR/archive/refs/tags/1.8.zip +SOURCE_SUM=ef9c0e71d4559994b9df0cd0a558f6faf11eba185c4793ba0e30f3500dab1b04 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=zip +SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index d459ef5..fc398ff 100644 --- a/manifest.json +++ b/manifest.json @@ -55,10 +55,15 @@ "type": "password" }, { - "name": "is_public", - "type": "boolean", - "default": true - } + "name": "language", + "type": "string", + "ask": { + "en": "Choose the application language", + "fr": "Choisissez la langue de l'application" + }, + "choices": ["fr_FR", "en_EN"], + "default": "fr_FR" + }, ] } } diff --git a/scripts/change_url b/scripts/change_url index 283ffda..cf889dd 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -34,6 +34,7 @@ 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) +language=$(ynh_app_setting_get --app=$app --key=language) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP diff --git a/scripts/install b/scripts/install index d779000..88d24ef 100644 --- a/scripts/install +++ b/scripts/install @@ -29,6 +29,7 @@ admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC password="$YNH_APP_ARG_PASSWORD" random=$(ynh_string_random --length=24) +language=$YNH_APP_ARG_LANGUAGE app=$YNH_APP_INSTANCE_NAME @@ -53,6 +54,8 @@ 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" +ynh_app_setting_set --app=$app --key=language --value=$language + #================================================= # INSTALL DEPENDENCIES #================================================= @@ -87,6 +90,8 @@ 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" +ynh_setup_source --dest_dir="$final_path/user/languages" --source_id="fr" + # copy index file cp ../conf/index.php $final_path/ From 587126fcd7b7482e0db9f335f8b73f6bb76edd8b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:15:17 +0100 Subject: [PATCH 29/57] Fix --- check_process | 1 - scripts/install | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/check_process b/check_process index 3e2a0c5..42673ae 100644 --- a/check_process +++ b/check_process @@ -3,7 +3,6 @@ domain="domain.tld" path="/path" admin="john" - is_public=1 password="1Strong-Password" ; Checks pkg_linter=1 diff --git a/scripts/install b/scripts/install index 88d24ef..3a0e906 100644 --- a/scripts/install +++ b/scripts/install @@ -26,7 +26,6 @@ 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) language=$YNH_APP_ARG_LANGUAGE @@ -139,22 +138,11 @@ 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..." --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 From 48134b0ac9aee3c0cf400a94652e3856910c6b89 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:18:01 +0100 Subject: [PATCH 30/57] remove is_public --- check_process | 1 - manifest.json | 5 ----- scripts/install | 13 +------------ 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/check_process b/check_process index 3e2a0c5..42673ae 100644 --- a/check_process +++ b/check_process @@ -3,7 +3,6 @@ domain="domain.tld" path="/path" admin="john" - is_public=1 password="1Strong-Password" ; Checks pkg_linter=1 diff --git a/manifest.json b/manifest.json index d459ef5..5c4d311 100644 --- a/manifest.json +++ b/manifest.json @@ -53,11 +53,6 @@ { "name": "password", "type": "password" - }, - { - "name": "is_public", - "type": "boolean", - "default": true } ] } diff --git a/scripts/install b/scripts/install index d779000..0af862c 100644 --- a/scripts/install +++ b/scripts/install @@ -26,7 +26,6 @@ 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) @@ -53,6 +52,7 @@ 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 #================================================= @@ -134,22 +134,11 @@ 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..." --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 From 6d079fadad1af64805d82f7ee93aa0d6975fdc96 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:20:15 +0100 Subject: [PATCH 31/57] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index fc398ff..6490b3e 100644 --- a/manifest.json +++ b/manifest.json @@ -31,7 +31,7 @@ "multi_instance": true, "services": [ "nginx", - "php7.3-fpm", + "php7.4-fpm", "mysql" ], "arguments": { @@ -61,7 +61,7 @@ "en": "Choose the application language", "fr": "Choisissez la langue de l'application" }, - "choices": ["fr_FR", "en_EN"], + "choices": ["fr_FR", "en_US"], "default": "fr_FR" }, ] From 956f6e043fe692065510d7ce0dbb5a914e2cb116 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:23:56 +0100 Subject: [PATCH 32/57] Fix --- conf/index.php | 2 +- doc/DESCRIPTION.md | 13 ++++++------- manifest.json | 4 ++-- scripts/change_url | 2 +- scripts/restore | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/conf/index.php b/conf/index.php index f5fc314..625af65 100644 --- a/conf/index.php +++ b/conf/index.php @@ -2,7 +2,7 @@ - YOURLS + YOURLS — Your Own URL Shortener diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 3c160a3..12d64f2 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -2,10 +2,9 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that ### 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 ! +- Private (your links only) or Public (everybody can create short links, fine for an intranet) +- 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 diff --git a/manifest.json b/manifest.json index 5c4d311..64e35e4 100644 --- a/manifest.json +++ b/manifest.json @@ -8,7 +8,6 @@ }, "version": "1.8.2~ynh1", "url": "https://yourls.org/", - "license": "MIT", "upstream": { "license": "MIT", "website": "https://yourls.org/", @@ -16,6 +15,7 @@ "admindoc": "https://github.com/YOURLS/YOURLS/wiki", "code": "https://github.com/YOURLS/YOURLS" }, + "license": "MIT", "maintainer": { "name": "Anmol Sharma", "email": "anmol@datamol.org" @@ -31,7 +31,7 @@ "multi_instance": true, "services": [ "nginx", - "php7.3-fpm", + "php7.4-fpm", "mysql" ], "arguments": { diff --git a/scripts/change_url b/scripts/change_url index 283ffda..5dd8d50 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -71,7 +71,7 @@ fi #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf diff --git a/scripts/restore b/scripts/restore index 58eae03..64970f1 100644 --- a/scripts/restore +++ b/scripts/restore @@ -60,7 +60,7 @@ ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring YOURLS main directory..." --weight=3 +ynh_script_progression --message="Restoring the app main directory..." --weight=3 ynh_restore_file --origin_path="$final_path" From b163d836ec5447526d54ca766295e628746ae22e Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 27 Feb 2022 10:24:01 +0000 Subject: [PATCH 33/57] Auto-update README --- README.md | 13 ++++++------- README_fr.md | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index b190179..a6eca02 100644 --- a/README.md +++ b/README.md @@ -19,13 +19,12 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that ### 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 ! +- Private (your links only) or Public (everybody can create short links, fine for an intranet) +- 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 **Shipped version:** 1.8.2~ynh1 diff --git a/README_fr.md b/README_fr.md index 76e6c16..082ea4b 100644 --- a/README_fr.md +++ b/README_fr.md @@ -15,13 +15,12 @@ YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that ### 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 ! +- Private (your links only) or Public (everybody can create short links, fine for an intranet) +- 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 **Version incluse :** 1.8.2~ynh1 From 2ffc7cee4bfe0bb44fe2f67cc39afa135e84030a Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:24:40 +0100 Subject: [PATCH 34/57] Update upgrade --- scripts/upgrade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upgrade b/scripts/upgrade index 9a316ce..c195e87 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -33,7 +33,7 @@ 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 +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 # Backup the current version of the app ynh_backup_before_upgrade From 093b8304fc82384d52752d19b6ca0bcc0621f816 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:27:07 +0100 Subject: [PATCH 35/57] Fix --- scripts/_common.sh | 2 +- scripts/upgrade | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 3a502cb..2d3fcc0 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ 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" +pkg_dependencies="php${YNH_PHP_VERSION}-gmp php${YNH_PHP_VERSION}-bcmath php${YNH_PHP_VERSION}-curl 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/upgrade b/scripts/upgrade index c195e87..876a9d6 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -47,6 +47,7 @@ ynh_abort_if_errors #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # If db_name doesn't exist, create it if [ -z "$db_name" ]; then From ede5457b0db76460f977d3e5562fa95eb6638ad8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:27:27 +0100 Subject: [PATCH 36/57] Update _common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 2d3fcc0..0a15338 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ 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}-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}-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" #================================================= # PERSONAL HELPERS From c3eef91fa9daa97468afbac4db9041a751513f5c Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:32:09 +0100 Subject: [PATCH 37/57] Update _common.sh --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 0a15338..aafa5fb 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ 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}-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" +pkg_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-mysql" #================================================= # PERSONAL HELPERS From 56097980c8bb4dd084149b267861bed33ce8b7f8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:35:07 +0100 Subject: [PATCH 38/57] Revert "Update _common.sh" This reverts commit c3eef91fa9daa97468afbac4db9041a751513f5c. --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index aafa5fb..0a15338 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,7 +7,7 @@ YNH_PHP_VERSION="7.4" # dependencies used by the app -pkg_dependencies="php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-mysql" +pkg_dependencies="php${YNH_PHP_VERSION}-gmp php${YNH_PHP_VERSION}-bcmath php${YNH_PHP_VERSION}-curl 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" #================================================= # PERSONAL HELPERS From bb5a5f9c3c21f4cf52c566cfd28b50415437aceb Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:36:47 +0100 Subject: [PATCH 39/57] Update config-sample.php --- conf/config-sample.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/config-sample.php b/conf/config-sample.php index f11c9ea..7319cb3 100644 --- a/conf/config-sample.php +++ b/conf/config-sample.php @@ -39,6 +39,8 @@ define( 'YOURLS_DB_PREFIX', 'yourls_' ); ** To use an IDN domain (eg http://héhé.com), write its ascii form here (eg http://xn--hh-bjab.com) */ define( 'YOURLS_SITE', 'http://__DOMAIN____PATH__' ); +define('YOURLS_ADMIN_SSL', true); + /** YOURLS language ** Change this setting to use a translation file for your language, instead of the default English. ** That translation file (a .mo file) must be installed in the user/language directory. From c80a484fe8c72ad92b1bb55813cc4c0088a9b4a2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 11:40:48 +0100 Subject: [PATCH 40/57] Update DESCRIPTION.md --- doc/DESCRIPTION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 12d64f2..74549cc 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,4 +1,5 @@ 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). +Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. ### YOURLS Features From 4877e4d522ad0658877ce7547c0eba3b12a72e75 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 27 Feb 2022 10:40:55 +0000 Subject: [PATCH 41/57] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index a6eca02..06c94d7 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## 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). +Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. ### YOURLS Features diff --git a/README_fr.md b/README_fr.md index 082ea4b..2f82c87 100644 --- a/README_fr.md +++ b/README_fr.md @@ -12,6 +12,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble 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). +Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. ### YOURLS Features From c8524df3aa5de18b9049a1dc184e4155ce3e1126 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 12:01:51 +0100 Subject: [PATCH 42/57] Update check_process --- check_process | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index 42673ae..d47583c 100644 --- a/check_process +++ b/check_process @@ -12,7 +12,7 @@ setup_private=1 setup_public=1 upgrade=1 - #upgrade=1 from_commit=CommitHash + upgrade=1 from_commit=455317a9e0a55ffb2cb80f79f2a2f56af4d3d671 backup_restore=1 multi_instance=1 change_url=1 @@ -20,6 +20,6 @@ Email= Notification=none ;;; Upgrade options - ; commit=CommitHash - name=Name and date of the commit. + ; commit=455317a9e0a55ffb2cb80f79f2a2f56af4d3d671 + name=Merge pull request #17 manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& From 05850e66c21eb554932e709e7c719ec7fff9d30b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 12:12:15 +0100 Subject: [PATCH 43/57] Update change_url --- scripts/change_url | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/change_url b/scripts/change_url index 5dd8d50..e4cbd99 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -26,7 +26,6 @@ app=$YNH_APP_INSTANCE_NAME #================================================= 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 From ae1611fc199bf976d97dacd10763ada2d30844f9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 12:13:13 +0100 Subject: [PATCH 44/57] Update DESCRIPTION.md --- doc/DESCRIPTION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md index 74549cc..52d2357 100644 --- a/doc/DESCRIPTION.md +++ b/doc/DESCRIPTION.md @@ -1,4 +1,5 @@ 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). + Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. ### YOURLS Features From 498eb8b198d1bf815d81f7421b886996f80a372d Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 27 Feb 2022 11:13:18 +0000 Subject: [PATCH 45/57] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 06c94d7..69edde7 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## 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). + Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. ### YOURLS Features diff --git a/README_fr.md b/README_fr.md index 2f82c87..1a12c1c 100644 --- a/README_fr.md +++ b/README_fr.md @@ -12,6 +12,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble 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). + Running your own URL shortener is fun, geeky and useful: you own your data and don't depend on third-party services. It's also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses. ### YOURLS Features From a80060f6ef52bfe961e1119e59a011b18f89ac1b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 21:22:32 +0100 Subject: [PATCH 46/57] Update check_process --- check_process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_process b/check_process index d47583c..e1f05ab 100644 --- a/check_process +++ b/check_process @@ -9,7 +9,7 @@ setup_sub_dir=1 setup_root=1 setup_nourl=0 - setup_private=1 + setup_private=0 setup_public=1 upgrade=1 upgrade=1 from_commit=455317a9e0a55ffb2cb80f79f2a2f56af4d3d671 From 1877d8e282e0d139bca6813dffae0c160d898710 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 27 Feb 2022 22:06:28 +0100 Subject: [PATCH 47/57] Fix --- manifest.json | 4 ++-- scripts/install | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index 6490b3e..02465cf 100644 --- a/manifest.json +++ b/manifest.json @@ -61,8 +61,8 @@ "en": "Choose the application language", "fr": "Choisissez la langue de l'application" }, - "choices": ["fr_FR", "en_US"], - "default": "fr_FR" + "choices": ["fr", "en"], + "default": "fr" }, ] } diff --git a/scripts/install b/scripts/install index 3a0e906..83017a7 100644 --- a/scripts/install +++ b/scripts/install @@ -53,7 +53,6 @@ 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" -ynh_app_setting_set --app=$app --key=language --value=$language #================================================= # INSTALL DEPENDENCIES @@ -89,7 +88,14 @@ 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" -ynh_setup_source --dest_dir="$final_path/user/languages" --source_id="fr" +if [ "$language" == "fr" ]; then + language="fr-FR" + ynh_setup_source --dest_dir="$final_path/user/languages" --source_id="fr" + ynh_app_setting_set --app=$app --key=language --value=$language +else + language="" + ynh_app_setting_set --app=$app --key=language --value=$language +fi # copy index file cp ../conf/index.php $final_path/ From 5777091d444d4962734b0a95d2874c50fb6a180d Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 16:31:15 +0100 Subject: [PATCH 48/57] Fix --- conf/config-sample.php | 2 +- scripts/install | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/conf/config-sample.php b/conf/config-sample.php index 552efaf..6b64eeb 100644 --- a/conf/config-sample.php +++ b/conf/config-sample.php @@ -45,7 +45,7 @@ define('YOURLS_ADMIN_SSL', true); ** Change this setting to use a translation file for your language, instead of the default English. ** That translation file (a .mo file) must be installed in the user/language directory. ** See http://yourls.org/translations for more information */ -define( 'YOURLS_LANG', '__LANGUAGE__' ); +define( 'YOURLS_LANG', 'fr_FR' ); /** Allow multiple short URLs for a same long URL ** Set to true to have only one pair of shortURL/longURL (default YOURLS behavior) diff --git a/scripts/install b/scripts/install index 83017a7..219403f 100644 --- a/scripts/install +++ b/scripts/install @@ -28,7 +28,6 @@ path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN password="$YNH_APP_ARG_PASSWORD" random=$(ynh_string_random --length=24) -language=$YNH_APP_ARG_LANGUAGE app=$YNH_APP_INSTANCE_NAME @@ -88,14 +87,7 @@ 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" -if [ "$language" == "fr" ]; then - language="fr-FR" - ynh_setup_source --dest_dir="$final_path/user/languages" --source_id="fr" - ynh_app_setting_set --app=$app --key=language --value=$language -else - language="" - ynh_app_setting_set --app=$app --key=language --value=$language -fi +ynh_setup_source --dest_dir="$final_path/user/languages" --source_id="fr" # copy index file cp ../conf/index.php $final_path/ From 900b9bb018f805a7fb94c7568fd47b08d57c764b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 16:41:12 +0100 Subject: [PATCH 49/57] Fix --- manifest.json | 12 +++++++++++- scripts/install | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 64e35e4..771afa9 100644 --- a/manifest.json +++ b/manifest.json @@ -53,7 +53,17 @@ { "name": "password", "type": "password" - } + }, + { + "name": "language", + "type": "string", + "ask": { + "en": "Choose the application language", + "fr": "Choisissez la langue de l'application" + }, + "choices": ["fr-FR", "en-US"], + "default": "fr-FR" + }, ] } } diff --git a/scripts/install b/scripts/install index 219403f..b5481af 100644 --- a/scripts/install +++ b/scripts/install @@ -28,6 +28,7 @@ path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN password="$YNH_APP_ARG_PASSWORD" random=$(ynh_string_random --length=24) +language=$YNH_APP_ARG_LANGUAGE app=$YNH_APP_INSTANCE_NAME @@ -87,6 +88,7 @@ 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" +# Install French language ynh_setup_source --dest_dir="$final_path/user/languages" --source_id="fr" # copy index file From 6f767bf4fc110a351a56521acf39d40887afdfb6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 16:41:57 +0100 Subject: [PATCH 50/57] Update config-sample.php --- conf/config-sample.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/config-sample.php b/conf/config-sample.php index 6b64eeb..552efaf 100644 --- a/conf/config-sample.php +++ b/conf/config-sample.php @@ -45,7 +45,7 @@ define('YOURLS_ADMIN_SSL', true); ** Change this setting to use a translation file for your language, instead of the default English. ** That translation file (a .mo file) must be installed in the user/language directory. ** See http://yourls.org/translations for more information */ -define( 'YOURLS_LANG', 'fr_FR' ); +define( 'YOURLS_LANG', '__LANGUAGE__' ); /** Allow multiple short URLs for a same long URL ** Set to true to have only one pair of shortURL/longURL (default YOURLS behavior) From 3145c84b7b1b4a5cbaaea11e889e5da7d734e8e9 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 16:44:29 +0100 Subject: [PATCH 51/57] Update install --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index b5481af..ce5331e 100644 --- a/scripts/install +++ b/scripts/install @@ -29,6 +29,7 @@ admin=$YNH_APP_ARG_ADMIN password="$YNH_APP_ARG_PASSWORD" random=$(ynh_string_random --length=24) language=$YNH_APP_ARG_LANGUAGE +phpversion=$YNH_PHP_VERSION app=$YNH_APP_INSTANCE_NAME @@ -111,9 +112,8 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 -# Create a dedicated php-fpm config +# Create a dedicated PHP-FPM config ynh_add_fpm_config -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) #================================================= # ADD A CONFIGURATION From 9f2f4a53e90965236bdf150336015994315b8486 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 17:04:41 +0100 Subject: [PATCH 52/57] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 771afa9..716c89b 100644 --- a/manifest.json +++ b/manifest.json @@ -63,7 +63,7 @@ }, "choices": ["fr-FR", "en-US"], "default": "fr-FR" - }, + } ] } } From 70476410cb99568dfaffb3f7af601de64777aab6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 17:07:05 +0100 Subject: [PATCH 53/57] Update install --- scripts/install | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/install b/scripts/install index ce5331e..e2ea809 100644 --- a/scripts/install +++ b/scripts/install @@ -53,6 +53,7 @@ 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=language--value=$language ynh_app_setting_set --app=$app --key=password --value="$password" #================================================= From d33cfd624f396ba516aa451c3a301a68db1f5afd Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 17:09:14 +0100 Subject: [PATCH 54/57] Update manifest.json --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 716c89b..d7db2a6 100644 --- a/manifest.json +++ b/manifest.json @@ -61,8 +61,8 @@ "en": "Choose the application language", "fr": "Choisissez la langue de l'application" }, - "choices": ["fr-FR", "en-US"], - "default": "fr-FR" + "choices": ["fr_FR", "en_US"], + "default": "fr_FR" } ] } From 99259a693f87af0514c688502e37c0dfb1da6333 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 17:11:38 +0100 Subject: [PATCH 55/57] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index e2ea809..b7bd852 100644 --- a/scripts/install +++ b/scripts/install @@ -53,7 +53,7 @@ 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=language--value=$language +ynh_app_setting_set --app=$app --key=language --value=$language ynh_app_setting_set --app=$app --key=password --value="$password" #================================================= From 7327fa3fc43c26347fe15881f011b0e7cd6f708e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 20:13:01 +0100 Subject: [PATCH 56/57] 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 625af65..52ec571 100644 --- a/conf/index.php +++ b/conf/index.php @@ -8,7 +8,7 @@ \ No newline at end of file From 0148661e767b45c89471ad707d86606b643a7800 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 28 Feb 2022 20:27:45 +0100 Subject: [PATCH 57/57] Update check_process --- check_process | 1 + 1 file changed, 1 insertion(+) diff --git a/check_process b/check_process index e1f05ab..f15a0e2 100644 --- a/check_process +++ b/check_process @@ -3,6 +3,7 @@ domain="domain.tld" path="/path" admin="john" + language="fr_FR" password="1Strong-Password" ; Checks pkg_linter=1