Subject: Re: [bug#70494] [PATCH 09/23] store: Add validate-store-name.

From: Ludovic Courtès <[email-masked]>
Date: Mon, 13 May 2024 18:04:14 +0200

Christopher Baines <[email-masked]> skribis:

> * guix/store.scm (validate-store-name): New procedure.
>
> Change-Id: I507d070d1cfdbd433d93830ee2937b1a1dee315a
> ---
>  guix/store.scm | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/guix/store.scm b/guix/store.scm
> index b83f205096..096efcd128 100644
> --- a/guix/store.scm
> +++ b/guix/store.scm
> @@ -205,6 +205,7 @@ (define-module (guix store)
>              store-path-package-name
>              store-path-hash-part
>              direct-store-path
> +            validate-store-name
>              derivation-log-file
>              log-file))
>  
> @@ -2303,6 +2304,16 @@ (define (store-path? path)
>    ;; `isStorePath' in Nix does something similar.
>    (string-prefix? (%store-prefix) path))
>  
> +(define (validate-store-name name)
> +  (string-for-each
> +   (lambda (c)
> +     (unless (or (char-alphabetic? c)
> +                 (char-numeric? c)
> +                 (member c '(#\+ #\- #\. #\_ #\? #\=)))
> +       (error (simple-format #f "invalid character ~A" c))))
> +   name)
> +  #t)

This is not the same as ‘checkStoreName’ in store-api.cc, due to Unicode
support.

So I think you have to specify the complete alphabet like
‘ensure-valid-store-file-name’ in (guix scripts download) does.

Also, distinguish ‘valid-store-name?’ from ‘validate-store-name’.

Raise a dedicated SRFI-35 error condition or use ‘formatted-message’; as
a rule of thumb, never use ‘error’ because it cannot be usefully handled
by callers.

Ludo’.