;; webid-oidc, implementation of the Solid specification ;; Copyright (C) 2020, 2021 Vivien Kraus ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU Affero General Public License as ;; published by the Free Software Foundation, either version 3 of the ;; License, or (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU Affero General Public License for more details. ;; You should have received a copy of the GNU Affero General Public License ;; along with this program. If not, see . (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)))