guix_mirror_bot pushed a commit to branch core-packages-team in repository guix.
commit 7de030e48d899cddde357700719ad42a74e82524 Author: Sergio Pastor Pérez <[email protected]> AuthorDate: Tue Mar 17 11:02:07 2026 +0100 utils: Add helpers to make files executable. * doc/guix.texi (Build Utilities, set-file-permissions): Document procedure. (make-file-executable): Document procedure. * guix/build/utils.scm (set-file-permissions): New procedure. (make-file-executable): Ne procedure. (make-file-writable): Implement using `set-file-permissions' (make-desktop-entry-file): Set executable permissions for destination desktop file. Change-Id: Ic4e5b3c30851c0d5cf262915aab190732b3b365b Signed-off-by: Zheng Junjie <[email protected]> --- doc/guix.texi | 8 ++++++++ guix/build/utils.scm | 25 ++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 7d3c96a28cb..b81c11a54dd 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -11840,10 +11840,18 @@ Create @var{directory} if it does not exist and copy @var{file} in there under the same name. @end deffn +@deffn {Procedure} set-file-permissions file permissions +Set the permissions of @var{file} to @var{permissions}. +@end deffn + @deffn {Procedure} make-file-writable file Make @var{file} writable for its owner. @end deffn +@deffn {Procedure} make-file-executable file +Make @var{file} executable. +@end deffn + @deffn {Procedure} copy-recursively source destination @ [#:log (current-output-port)] [#:follow-symlinks? #f] @ [#:copy-file copy-file] [#:keep-mtime? #f] [#:keep-permissions? #t] @ diff --git a/guix/build/utils.scm b/guix/build/utils.scm index 2d88b865b01..c73d3fda320 100644 --- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -11,6 +11,7 @@ ;;; Copyright © 2021 Brendan Tildesley <[email protected]> ;;; Copyright © 2023 Carlo Zancanaro <[email protected]> ;;; Copyright © 2025 Brice Waegeneire <[email protected]> +;;; Copyright © 2026 Sergio Pastor Pérez <[email protected]> ;;; ;;; This file is part of GNU Guix. ;;; @@ -75,7 +76,9 @@ with-directory-excursion mkdir-p install-file + set-file-permissions make-file-writable + make-file-executable copy-recursively delete-file-recursively delete-all-but @@ -424,10 +427,18 @@ name." (mkdir-p directory) (copy-file file (string-append directory "/" (basename file)))) +(define (set-file-permissions file permissions) + "Set the permissions of FILE to PERMISSIONS." + (let ((stat (lstat file))) + (chmod file (logior permissions (stat:perms stat))))) + (define (make-file-writable file) "Make FILE writable for its owner." - (let ((stat (lstat file))) ;XXX: symlinks - (chmod file (logior #o600 (stat:perms stat))))) + (set-file-permissions file #o600)) + +(define (make-file-executable file) + "Make FILE executable." + (set-file-permissions file #o555)) (define* (copy-recursively source destination #:key @@ -1662,7 +1673,15 @@ https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-lat value)) (_ (parse key value))) - (loop (cddr args)))))))) + (loop (cddr args))))))) + ;; Program launchers such as Plasma's expect desktop files to be either + ;; owned by root or executable, this is a security measure since any exec + ;; line in a desktop file essentially makes the file as dangerous as an + ;; executable file. + ;; + ;; For more information, read the discussion on: + ;; https://codeberg.org/guix/guix/issues/1578 + (make-file-executable destination)) ;;;
