(define-module (webid-oidc authorization-page) #:use-module (webid-oidc errors) #:use-module ((webid-oidc authorization-page-unsafe) #:prefix unsafe:) #:use-module (ice-9 i18n) #:use-module (ice-9 string-fun) #:use-module (ice-9 receive) #:use-module (ice-9 threads)) (define locale-mutex (make-mutex)) (define-syntax with-locale (syntax-rules () ((with-locale web-locale . job) (let ((locale-with-underscore (if (equal? web-locale "C") ;; For the unit tests "C" (string-append (string-replace-substring web-locale "-" "_") ".UTF-8"))) (previous-locale (setlocale LC_ALL))) (dynamic-wind (lambda () (lock-mutex locale-mutex)) (lambda () (dynamic-wind (lambda () (with-exception-handler (lambda (error) (raise-unknown-client-locale web-locale locale-with-underscore) (setlocale LC_ALL "C")) (lambda () (setlocale LC_ALL locale-with-underscore)) #:unwind? #t)) (lambda () . job) (lambda () (setlocale LC_ALL previous-locale)))) (lambda () (unlock-mutex locale-mutex))))))) (define-public (authorization-page locale credential-invalid? client-id post-uri) (with-locale locale (unsafe:authorization-page credential-invalid? client-id post-uri))) (define-public (error-no-client-id locale) (with-locale locale (unsafe:error-no-client-id))) (define-public (error-no-redirect-uri locale) (with-locale locale (unsafe:error-no-redirect-uri))) (define-public (error-application locale error) (with-locale locale (unsafe:error-application error))) (define-public (redirection locale client-id uri) (with-locale locale (unsafe:redirection client-id uri)))