From 2a1530f4f9bf4385f6dbd67fb090824382f9e4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20unbrot=20P=C3=A4tzold?= Date: Mon, 4 May 2026 13:23:08 +0200 Subject: [PATCH] nextcloud/user_run: convert to POSIX sh, clean up loop and alignment - Shebang changed to sh; replace all [[ ]] with [ ], == with = in [ ] - Loop over CLIENT_DATA_SYNC[@] directly instead of counting to 100; replace index-based first-entry check with a _nc_first flag - Fix missing fi before done, remove stray fi after KWallet block - Dedent KWallet block to top level (was left indented from inside the loop) Co-Authored-By: Claude Sonnet 4.6 --- .../0050_nextcloud_desktopclient/user_run.sh | 118 +++++++++--------- 1 file changed, 58 insertions(+), 60 deletions(-) diff --git a/client_software/0050_nextcloud_desktopclient/user_run.sh b/client_software/0050_nextcloud_desktopclient/user_run.sh index f37b760..5a7e50f 100755 --- a/client_software/0050_nextcloud_desktopclient/user_run.sh +++ b/client_software/0050_nextcloud_desktopclient/user_run.sh @@ -13,7 +13,7 @@ echo "Setup Nextcloud- Sync" BASECMD="/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nextcloud com.nextcloud.desktopclient.nextcloud" #Check Token -if [ "${DAVTOKEN_USER}." == "." ]; then +if [ "${DAVTOKEN_USER}." = "." ]; then # Todo: Move all task to some function to logon as user and get all vars, call it and proceed here echo "Error: Script cannot be executed standalone and needs a prereserved Environment. Quit." exit 1 @@ -22,29 +22,29 @@ fi #Remove Nextcloud from autostart anyway! Must be started by this script manually, because if it was started befor the ecrypted mount, #it will never sync and always throw an error that the local dir is missing if [ -f "$SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop" ]; then - echo "Remove Autostart Nextcloud" - rm $SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop + echo "Remove Autostart Nextcloud" + rm $SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop fi NC_PID=$( pgrep -u $USER nextcloud ) -if [[ ! -z ${NC_PID} ]]; then +if [ -n "${NC_PID}" ]; then echo "Stopping Nextcloud with PID ${NC_PID}" /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nextcloud com.nextcloud.desktopclient.nextcloud --quit >/dev/null - if [[ $? -ne 0 ]]; then - echo "Service could not be stopped, please check why." - exit 1 + if [ $? -ne 0 ]; then + echo "Service could not be stopped, please check why." + exit 1 fi sleep 0.5 fi NC_PID=$( pgrep -u $USER nextcloud ) -if [[ ! -z ${NC_PID} ]]; then +if [ -n "${NC_PID}" ]; then echo "Nextcloud still running with PID ${NC_PID}. Force stop" # Kill does not remove lockfiles in ~/.var/app/com.nextcloud.desktopclient.nextcloud/cache/tmp/ which will prevent next start kill ${NC_PID} - if [[ $? -ne 0 ]]; then - echo "Service could not be stopped, please check why." - exit 1 + if [ $? -ne 0 ]; then + echo "Service could not be stopped, please check why." + exit 1 fi sleep 0.5 rm -rif ${HOME}/.var/app/com.nextcloud.desktopclient.nextcloud/cache/temp/* @@ -55,17 +55,14 @@ declare -p CLIENT_DATA_SYNC_DECLARE >/dev/null eval "${CLIENT_DATA_SYNC_DECLARE}" declare -p CLIENT_DATA_SYNC_DECLARE CLIENT_DATA_SYNC >/dev/null eval "${CLIENT_DATA_SYNC}" -if [[ "${#CLIENT_DATA_SYNC[@]}" == "0" ]]; then +if [ "${#CLIENT_DATA_SYNC[@]}" -eq 0 ]; then echo "CLIENT_DATA_SYNC not set, skipping setup of Nextcloud Desktop sync" exit 0 fi #Loop through all Entries -for i in {0..99}; do - if [[ -z ${CLIENT_DATA_SYNC[$i]} ]]; then - break - fi - CLIENT_DATA_DECLARE_LINE="${CLIENT_DATA_SYNC[$i]}" +_nc_first=1 +for CLIENT_DATA_DECLARE_LINE in "${CLIENT_DATA_SYNC[@]}"; do eval "${CLIENT_DATA_DECLARE_LINE}" # echo "DEBUG user_run.sh(0020)_2: ${CLIENT_DATA_SYNC_LINE[@]}" # Now, CLIENT_DATA_SYNC_LINE[0] contains the local path and CLIENT_DATA_SYNC_LINE[1] contains the remote path @@ -73,10 +70,11 @@ for i in {0..99}; do echo "Already found configured local folder ${CLIENT_DATA_SYNC_LINE[0]} syncing with ${CLIENT_DATA_SYNC_LINE[1]} . Leaving it unchanged." else echo "Setup new sync from remote ${CLIENT_DATA_SYNC_LINE[1]} to local ${CLIENT_DATA_SYNC_LINE[0]}" - if [[ $i -gt 0 ]]; then - echo "Due to Bug in Nextcloud Client, more than one synced Folder cannot be setup currently. Maybe in the Future." - continue; + if [ "${_nc_first}" -eq 0 ]; then + echo "Due to Bug in Nextcloud Client, more than one synced Folder cannot be setup currently. Maybe in the Future." + continue fi + _nc_first=0 if [ -d "${CLIENT_DATA_SYNC_LINE[0]}" ]; then echo "Old unsynced Folder ${CLIENT_DATA_SYNC_LINE[0]} was found, renaming to ${CLIENT_DATA_SYNC_LINE[0]}_bak." mv "${CLIENT_DATA_SYNC_LINE[0]}" "${CLIENT_DATA_SYNC_LINE[0]}_bak" @@ -96,50 +94,50 @@ for i in {0..99}; do echo "Please check the above output!" exit 1 fi + fi done # The Flatpak autoprovisioning may not successfully write the apppassword to - # KWallet from inside the sandbox, so write it directly via D-Bus. - # Nextcloud stores HTTP credentials in folder "Nextcloud" with keys: - # user:url/:0 (legacy password entry) - # user_app-password:url/:0 (app password entry, used for auth) - NC_WALLET_URL="https://${SERVERFQDN_NC}/" - NC_WALLET_APPID="logon_script" - NC_QB_CMD="qdbus-qt6" - if ! command -v ${NC_QB_CMD} >/dev/null 2>&1; then NC_QB_CMD="qdbus"; fi - # Only attempt KWallet on KDE: check that the service is registered on the session bus. - if command -v "${NC_QB_CMD}" >/dev/null 2>&1 && \ - "${NC_QB_CMD}" 2>/dev/null | grep -q "org.kde.kwalletd"; then - NC_QB_SVC="org.kde.kwalletd" - NC_QB_PATH="/modules/kwalletd6" - if ! ( ${NC_QB_CMD} "${NC_QB_SVC}" | grep -q "${NC_QB_PATH}" ); then - NC_QB_PATH="/modules/kwalletd5" - fi - echo "Checking Nextcloud app password in KWallet via D-Bus (${NC_QB_PATH})" - NC_WALLET_HANDLE=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.open "kdewallet" 0 "${NC_WALLET_APPID}") - if [[ -n "${NC_WALLET_HANDLE}" && "${NC_WALLET_HANDLE}" != "-1" ]]; then - HAS_FOLDER=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.hasFolder "${NC_WALLET_HANDLE}" "Nextcloud" "${NC_WALLET_APPID}") - if [[ "${HAS_FOLDER}" != "true" ]]; then - ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.createFolder "${NC_WALLET_HANDLE}" "Nextcloud" "${NC_WALLET_APPID}" >/dev/null - fi - HAS_PW1=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.hasEntry "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}:${NC_WALLET_URL}:0" "${NC_WALLET_APPID}") - HAS_PW2=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.hasEntry "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}_app-password:${NC_WALLET_URL}:0" "${NC_WALLET_APPID}") - if [[ "${HAS_PW1}" == "true" && "${HAS_PW2}" == "true" ]]; then - echo "Nextcloud app password already present in KWallet — no change needed." - else - ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.writePassword "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}:${NC_WALLET_URL}:0" "${DAVTOKEN_PASS}" "${NC_WALLET_APPID}" >/dev/null - ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.writePassword "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}_app-password:${NC_WALLET_URL}:0" "${DAVTOKEN_PASS}" "${NC_WALLET_APPID}" >/dev/null - echo "Nextcloud app password written to KWallet successfully." - fi - ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.sync "${NC_WALLET_HANDLE}" "${NC_WALLET_APPID}" >/dev/null - ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.close "${NC_WALLET_HANDLE}" false "${NC_WALLET_APPID}" >/dev/null - else - echo "Warning: Could not open KWallet (handle: ${NC_WALLET_HANDLE}). Nextcloud may prompt for credentials on next start." - fi - else - echo "KWallet not available (non-KDE desktop) — skipping credential storage." - fi +# KWallet from inside the sandbox, so write it directly via D-Bus. +# Nextcloud stores HTTP credentials in folder "Nextcloud" with keys: +# user:url/:0 (legacy password entry) +# user_app-password:url/:0 (app password entry, used for auth) +NC_WALLET_URL="https://${SERVERFQDN_NC}/" +NC_WALLET_APPID="logon_script" +NC_QB_CMD="qdbus-qt6" +if ! command -v ${NC_QB_CMD} >/dev/null 2>&1; then NC_QB_CMD="qdbus"; fi +# Only attempt KWallet on KDE: check that the service is registered on the session bus. +if command -v "${NC_QB_CMD}" >/dev/null 2>&1 && \ + "${NC_QB_CMD}" 2>/dev/null | grep -q "org.kde.kwalletd"; then + NC_QB_SVC="org.kde.kwalletd" + NC_QB_PATH="/modules/kwalletd6" + if ! ( ${NC_QB_CMD} "${NC_QB_SVC}" | grep -q "${NC_QB_PATH}" ); then + NC_QB_PATH="/modules/kwalletd5" fi + echo "Checking Nextcloud app password in KWallet via D-Bus (${NC_QB_PATH})" + NC_WALLET_HANDLE=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.open "kdewallet" 0 "${NC_WALLET_APPID}") + if [ -n "${NC_WALLET_HANDLE}" ] && [ "${NC_WALLET_HANDLE}" != "-1" ]; then + HAS_FOLDER=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.hasFolder "${NC_WALLET_HANDLE}" "Nextcloud" "${NC_WALLET_APPID}") + if [ "${HAS_FOLDER}" != "true" ]; then + ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.createFolder "${NC_WALLET_HANDLE}" "Nextcloud" "${NC_WALLET_APPID}" >/dev/null + fi + HAS_PW1=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.hasEntry "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}:${NC_WALLET_URL}:0" "${NC_WALLET_APPID}") + HAS_PW2=$(${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.hasEntry "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}_app-password:${NC_WALLET_URL}:0" "${NC_WALLET_APPID}") + if [ "${HAS_PW1}" = "true" ] && [ "${HAS_PW2}" = "true" ]; then + echo "Nextcloud app password already present in KWallet — no change needed." + else + ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.writePassword "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}:${NC_WALLET_URL}:0" "${DAVTOKEN_PASS}" "${NC_WALLET_APPID}" >/dev/null + ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.writePassword "${NC_WALLET_HANDLE}" "Nextcloud" "${DAVTOKEN_USER}_app-password:${NC_WALLET_URL}:0" "${DAVTOKEN_PASS}" "${NC_WALLET_APPID}" >/dev/null + echo "Nextcloud app password written to KWallet successfully." + fi + ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.sync "${NC_WALLET_HANDLE}" "${NC_WALLET_APPID}" >/dev/null + ${NC_QB_CMD} ${NC_QB_SVC} ${NC_QB_PATH} org.kde.KWallet.close "${NC_WALLET_HANDLE}" false "${NC_WALLET_APPID}" >/dev/null + else + echo "Warning: Could not open KWallet (handle: ${NC_WALLET_HANDLE}). Nextcloud may prompt for credentials on next start." + fi +else + echo "KWallet not available (non-KDE desktop) — skipping credential storage." +fi # Now start Nextcloud echo "Starting Nextcloud Client in Background"