From 8e7f8fd415176dbae702028045d876fb93cc23da Mon Sep 17 00:00:00 2001 From: Daniel Mach Date: Wed, 14 Feb 2024 14:19:59 +0100 Subject: [PATCH 1/3] Honor XDG_CONFIG_HOME and XDG_CACHE_HOME env vars --- osc/conf.py | 6 ++---- osc/core.py | 3 ++- osc/oscssl.py | 5 +++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/osc/conf.py b/osc/conf.py index 998ebae1..a302e7e5 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -2055,13 +2055,11 @@ def identify_conf(): # needed for compat reasons(users may have their oscrc still in ~ if 'OSC_CONFIG' in os.environ: return os.environ.get('OSC_CONFIG') + if os.path.exists(os.path.expanduser('~/.oscrc')): return '~/.oscrc' - if os.environ.get('XDG_CONFIG_HOME', '') != '': - conffile = f"{os.environ.get('XDG_CONFIG_HOME')}/osc/oscrc" - else: - conffile = '~/.config/osc/oscrc' + conffile = os.path.join(xdg.XDG_CONFIG_HOME, "osc", "oscrc") return conffile diff --git a/osc/core.py b/osc/core.py index 321623dd..6f54df49 100644 --- a/osc/core.py +++ b/osc/core.py @@ -53,6 +53,7 @@ from . import oscerr from . import store as osc_store from .connection import http_request, http_GET, http_POST, http_PUT, http_DELETE from .store import Store +from .util import xdg from .util.helper import decode_list, decode_it, raw_input, _html_escape from .util.xml import xml_indent_compat as xmlindent @@ -4512,7 +4513,7 @@ def _edit_message_open_editor(filename, data, orig_mtime): if os.stat(filename).st_mtime != orig_mtime: # file has changed - cache_dir = os.path.expanduser("~/.cache/osc/edited-messages") + cache_dir = os.path.expanduser(os.path.join(xdg.XDG_CACHE_HOME, "osc", "edited-messages")) try: os.makedirs(cache_dir, mode=0o700) except FileExistsError: diff --git a/osc/oscssl.py b/osc/oscssl.py index b4d4f3ad..fd6a0111 100644 --- a/osc/oscssl.py +++ b/osc/oscssl.py @@ -13,6 +13,7 @@ from cryptography.hazmat.primitives import serialization from urllib3.util.ssl_ import create_urllib3_context from . import oscerr +from .util import xdg # based on openssl's include/openssl/x509_vfy.h.in @@ -55,7 +56,7 @@ class TrustedCertStore: if not self.host: raise ValueError("Empty `host`") - self.dir_path = os.path.expanduser("~/.config/osc/trusted-certs") + self.dir_path = os.path.expanduser(os.path.join(xdg.XDG_CONFIG_HOME, "osc", "trusted-certs")) if not os.path.isdir(self.dir_path): try: os.makedirs(self.dir_path, mode=0o700) @@ -103,7 +104,7 @@ class TrustedCertStore: Temporarily trust the certificate. """ self.cert = cert - tmp_dir = os.path.expanduser("~/.config/osc") + tmp_dir = os.path.expanduser(os.path.join(xdg.XDG_CONFIG_HOME, "osc")) data = self.cert.public_bytes(serialization.Encoding.PEM) with tempfile.NamedTemporaryFile(mode="wb+", dir=tmp_dir, prefix="temp_trusted_cert_") as f: f.write(data) From 8fc1ad5220916d5a464335e8e7aa9ff185948994 Mon Sep 17 00:00:00 2001 From: Daniel Mach Date: Wed, 21 Feb 2024 09:23:29 +0100 Subject: [PATCH 2/3] Warn about ignoring XDG_CONFIG_HOME and ~/.config/osc/oscrc if ~/.oscrc exists --- osc/conf.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/osc/conf.py b/osc/conf.py index a302e7e5..a581b1aa 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -65,6 +65,7 @@ from urllib.parse import urlsplit from . import credentials from . import OscConfigParser from . import oscerr +from .output import tty from .util import xdg from .util.helper import raw_input from .util.models import * @@ -2056,11 +2057,17 @@ def identify_conf(): if 'OSC_CONFIG' in os.environ: return os.environ.get('OSC_CONFIG') - if os.path.exists(os.path.expanduser('~/.oscrc')): - return '~/.oscrc' - conffile = os.path.join(xdg.XDG_CONFIG_HOME, "osc", "oscrc") + if os.path.exists(os.path.expanduser("~/.oscrc")) or os.path.islink(os.path.expanduser("~/.oscrc")): + if "XDG_CONFIG_HOME" in os.environ: + print(f"{tty.colorize('WARNING', 'yellow,bold')}: Ignoring XDG_CONFIG_HOME env, loading an existing config from '~/.oscrc' instead", file=sys.stderr) + print(" To fix this, move the existing '~/.oscrc' to XDG location such as '~/.config/osc/oscrc'", file=sys.stderr) + elif os.path.exists(os.path.expanduser(conffile)): + print(f"{tty.colorize('WARNING', 'yellow,bold')}: Ignoring config '{conffile}' in XDG location, loading an existing config from ~/.oscrc instead", file=sys.stderr) + print(" To fix this, remove '~/.oscrc'", file=sys.stderr) + return '~/.oscrc' + return conffile From eab83d361274b5474d30f34dab02b1b4c26a064e Mon Sep 17 00:00:00 2001 From: Daniel Mach Date: Thu, 22 Feb 2024 08:19:22 +0100 Subject: [PATCH 3/3] Fix resolving config symlink to the actual config file --- osc/conf.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osc/conf.py b/osc/conf.py index a581b1aa..f77d183d 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -1606,14 +1606,14 @@ def get_configParser(conffile=None, force_read=False): def write_config(fname, cp): """write new configfile in a safe way""" - if os.path.exists(fname) and not os.path.isfile(fname): - # only write to a regular file - return - # config file is behind a symlink # resolve the symlink and continue writing the config as usual if os.path.islink(fname): - fname = os.readlink(fname) + fname = os.path.realpath(fname) + + if os.path.exists(fname) and not os.path.isfile(fname): + # only write to a regular file + return # create directories to the config file (if they don't exist already) fdir = os.path.dirname(fname)