From e48f693b7c4752f3f78fcfad3fad49a9a7e68c18 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 13 Mar 2025 11:08:58 +0000 Subject: [PATCH 01/10] Add permissions test for server check command #408 --- server/mergin/commands.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index 3b2b16d4..cabdf021 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -82,6 +82,16 @@ def _send_email(email: str): f"Error sending email: {e}", ) + def _check_permissions(path): + import os + + if not os.access(path, os.W_OK): + _echo_error( + f"Permissions for {path} folder not set correctly. Please review these settings.", + ) + else: + click.secho(f"Permissions granted for {path} folder", fg="green") + def _check_server(): # pylint: disable=W0612 """Check server configuration.""" @@ -117,6 +127,12 @@ def _check_server(): # pylint: disable=W0612 else: click.secho("Database initialized properly", fg="green") + if edition == "Community Edition": + _check_permissions('/data') + else: + _check_permissions('/data') + _check_permissions('/overviews') + _check_celery() def _init_db(): From 9028e053982026a547c9d2f371980ac4a7d675bc Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 13 Mar 2025 11:41:02 +0000 Subject: [PATCH 02/10] update CLA signed list --- LICENSES/CLA-signed-list.md | 1 + 1 file changed, 1 insertion(+) diff --git a/LICENSES/CLA-signed-list.md b/LICENSES/CLA-signed-list.md index 4ea70fd0..4c36d6bf 100644 --- a/LICENSES/CLA-signed-list.md +++ b/LICENSES/CLA-signed-list.md @@ -19,3 +19,4 @@ C/ My company has custom contribution contract with Lutra Consulting Ltd. or I a * lavor, 26th April 2023 * luxusko, 25th August 2023 * jozef-budac, 30th January 2024 +* fernandinand, 13th March 2025 \ No newline at end of file From 5a3e61f25f80bb87d3c4c8e25b047c0cd5dd4811 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 13 Mar 2025 11:44:46 +0000 Subject: [PATCH 03/10] reformat to black --- server/mergin/commands.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index cabdf021..eb0453e6 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -128,10 +128,10 @@ def _check_server(): # pylint: disable=W0612 click.secho("Database initialized properly", fg="green") if edition == "Community Edition": - _check_permissions('/data') + _check_permissions("/data") else: - _check_permissions('/data') - _check_permissions('/overviews') + _check_permissions("/data") + _check_permissions("/overviews") _check_celery() From 8b273fd8846b530b78b78a3d409860b47abb0772 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 13 Mar 2025 12:01:50 +0000 Subject: [PATCH 04/10] Address PR remarks/changes requested --- server/mergin/commands.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index eb0453e6..3314c6df 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -2,6 +2,7 @@ from flask import Flask import random import string +import os from datetime import datetime, timezone @@ -83,7 +84,7 @@ def _send_email(email: str): ) def _check_permissions(path): - import os + """ Check for write permission on working folders """ if not os.access(path, os.W_OK): _echo_error( @@ -127,11 +128,7 @@ def _check_server(): # pylint: disable=W0612 else: click.secho("Database initialized properly", fg="green") - if edition == "Community Edition": - _check_permissions("/data") - else: - _check_permissions("/data") - _check_permissions("/overviews") + _check_permissions("/data") _check_celery() From e6e1b8b02b8340d7c0e29c5af83ea0db08dcdd31 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 13 Mar 2025 12:04:56 +0000 Subject: [PATCH 05/10] black reformat not enabled --- server/mergin/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index 3314c6df..187cb64f 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -84,7 +84,7 @@ def _send_email(email: str): ) def _check_permissions(path): - """ Check for write permission on working folders """ + """Check for write permission on working folders""" if not os.access(path, os.W_OK): _echo_error( From e63bf56fd5038ab4ee9871d7a89fd333fb06f9b9 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Tue, 18 Mar 2025 10:17:26 +0000 Subject: [PATCH 06/10] Have permissions test at CLI level --- server/mergin/commands.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index 187cb64f..fbd2ccf9 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -1,3 +1,5 @@ +from email.policy import default + import click from flask import Flask import random @@ -222,3 +224,9 @@ def send_check_email(email: str): # pylint: disable=W0612 def check(): """Check server configuration.""" _check_server() + + @server.command() + @click.option("--path", required=False, default="/data") + def permissions(path: str): + """Check for specific path write permission""" + _check_permissions(path) From bfff68d5eaae1241ffee466ffdd37c264a876345 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 20 Mar 2025 11:37:26 +0000 Subject: [PATCH 07/10] have projects folder from env --- server/mergin/commands.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index fbd2ccf9..b0473d93 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -1,5 +1,3 @@ -from email.policy import default - import click from flask import Flask import random @@ -226,7 +224,9 @@ def check(): _check_server() @server.command() - @click.option("--path", required=False, default="/data") + @click.option( + "--path", required=False, default=app.config.get("LOCAL_PROJECTS", "/data") + ) def permissions(path: str): """Check for specific path write permission""" _check_permissions(path) From 88c8401cb0b864c7af8226671ee7859a632a7f46 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 27 Mar 2025 09:46:58 +0000 Subject: [PATCH 08/10] Check first LOCAL_PROJECTS env var --- server/mergin/commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/mergin/commands.py b/server/mergin/commands.py index b0473d93..84ca1313 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -128,7 +128,7 @@ def _check_server(): # pylint: disable=W0612 else: click.secho("Database initialized properly", fg="green") - _check_permissions("/data") + _check_permissions(app.config.get("LOCAL_PROJECTS", "/data")) _check_celery() From 31c56f134e5d8821334676ac47333515eb312585 Mon Sep 17 00:00:00 2001 From: Fernando Ribeiro Date: Thu, 27 Mar 2025 10:40:12 +0000 Subject: [PATCH 09/10] Add server commands configs on app initialization --- server/mergin/app.py | 5 +++-- server/mergin/commands.py | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/server/mergin/app.py b/server/mergin/app.py index 0f23e2ac..5764d0a3 100644 --- a/server/mergin/app.py +++ b/server/mergin/app.py @@ -29,7 +29,7 @@ from .sync.utils import get_blacklisted_dirs, get_blacklisted_files from .config import Configuration -from .commands import add_commands +from .commands import add_commands as server_commands convention = { "ix": "ix_%(column_0_label)s", @@ -139,7 +139,7 @@ def create_simple_app() -> Flask: if Configuration.GEVENT_WORKER: flask_app.wsgi_app = GeventTimeoutMiddleware(flask_app.wsgi_app) - add_commands(flask_app) + server_commands(flask_app) return flask_app @@ -189,6 +189,7 @@ def create_app(public_keys: List[str] = None) -> Flask: login_manager.init_app(app.app) # register auth blueprint register_auth(app.app) + server_commands(app.app) # adjust login manager @login_manager.user_loader diff --git a/server/mergin/commands.py b/server/mergin/commands.py index 84ca1313..eef371fa 100644 --- a/server/mergin/commands.py +++ b/server/mergin/commands.py @@ -128,7 +128,7 @@ def _check_server(): # pylint: disable=W0612 else: click.secho("Database initialized properly", fg="green") - _check_permissions(app.config.get("LOCAL_PROJECTS", "/data")) + _check_permissions(app.config.get("LOCAL_PROJECTS")) _check_celery() @@ -224,9 +224,7 @@ def check(): _check_server() @server.command() - @click.option( - "--path", required=False, default=app.config.get("LOCAL_PROJECTS", "/data") - ) + @click.option("--path", required=False, default=app.config.get("LOCAL_PROJECTS")) def permissions(path: str): """Check for specific path write permission""" _check_permissions(path) From ddbdbf531effa351ae3cadf1fe53a90988e9d4b4 Mon Sep 17 00:00:00 2001 From: Martin Varga Date: Fri, 4 Apr 2025 11:57:07 +0200 Subject: [PATCH 10/10] Remove duplicate cmd registration --- server/mergin/app.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/mergin/app.py b/server/mergin/app.py index 5764d0a3..654d5c04 100644 --- a/server/mergin/app.py +++ b/server/mergin/app.py @@ -139,8 +139,6 @@ def create_simple_app() -> Flask: if Configuration.GEVENT_WORKER: flask_app.wsgi_app = GeventTimeoutMiddleware(flask_app.wsgi_app) - server_commands(flask_app) - return flask_app