;; disfluid, implementation of the Solid specification ;; Copyright (C) 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 client gui authorization-prompt) #:use-module (gi) #:use-module (gi types) #:use-module (gi util) #:use-module (ice-9 match) #:use-module (ice-9 exceptions) #:use-module (ice-9 i18n) #:use-module (ice-9 receive) #:use-module (ice-9 optargs) #:use-module (ice-9 pretty-print) #:use-module (srfi srfi-9) #:use-module (srfi srfi-19) #:use-module (srfi srfi-26) #:use-module (webid-oidc errors) #:use-module ((webid-oidc stubs) #:prefix stubs:) #:use-module (webid-oidc web-i18n) #:use-module ((webid-oidc config) #:prefix config:) #:use-module (webid-oidc client client) #:use-module (webid-oidc client accounts) #:use-module (webid-oidc jwk) #:use-module (webid-oidc oidc-id-token) #:use-module (web uri) #:use-module (web response) #:use-module (rnrs bytevectors) #:use-module (oop goops) #:declarative? #t #:duplicates (merge-generics) #:export ( make-authorization-prompt )) (push-duplicate-handler! 'merge-generics) ;; This avoids a crash when compiling the module (use-typelibs ("GdkPixbuf" "2.0") ("Gtk" "3.0")) (define (make-authorization-prompt uri) ;; Return 3 values: ;; - the builder ;; - the whole widget ;; - a 2-value function (reason, continuation) to add a handler (let ((builder (builder:new-from-file (string-append config:uidir "/authorization-prompt.glade")))) (let ((whole-widget (builder:get-object builder "authorization_prompt")) (reason-label (builder:get-object builder "reason")) (link-button (builder:get-object builder "authorization_link")) (entry (builder:get-object builder "authorization_code_entry")) (ok (builder:get-object builder "ok_button")) (reasons '()) (handlers '())) (let ((handle (lambda (reason continuation) (label:set-text reason-label ((@ (ice-9 format) format) #f (G_ "Your authorization is required: ~a") (if (null? reasons) reason (format #f (G_ "~a, and ~a") (string-join (reverse reasons) ", ") reason)))) (set! reasons `(,reason ,@reasons)) (set! handlers `(,continuation ,@handlers))))) (link-button:set-uri link-button (uri->string uri)) ((@ (gi) connect) entry activate (lambda _ (button:clicked ok))) ((@ (gi) connect) ok clicked (lambda _ (let ((code (entry:get-text entry))) ((@ (srfi srfi-1) for-each) (cute <> code) (reverse handlers))))) (values builder whole-widget handle)))))