(define-module (webid-oidc stubs) #:use-module (webid-oidc config) #:use-module (webid-oidc errors) #:use-module (json)) (load-extension (format #f "~a/libwebidoidc" libdir) "init_webidoidc") (define (fix-base64-decode data) (catch 'base64-decoding-error (lambda () (base64-decode data)) (lambda error (raise-not-base64 data error)))) (define (fix-generate-key . args) (catch 'unsupported-crv (lambda () (apply generate-key args)) (lambda (error) (raise-unsupported-crv (cadr error))))) (define (fix-kty key) (catch 'unsupported-crv (lambda () (let ((ret (kty key))) (unless ret (raise-not-a-jwk key #f)) ret)) (lambda error (raise-unsupported-crv (cadr error))))) (define (fix-hash alg payload) (catch 'unsupported-alg (lambda () (hash alg payload)) (lambda error (raise-unsupported-alg (cadr error))))) (export base64-encode (fix-base64-decode . base64-decode) random random-init! (fix-generate-key . generate-key) (fix-kty . kty) strip-key (fix-hash . hash) jkt) ;; json reader from guile-json will not behave consistently with ;; SRFI-180 with objects: keys will be mapped to strings, not ;; symbols. So we fix alist keys to be symbols. (define-public (fix-alists data) (define (fix-an-alist rest alist) (if (null? alist) (reverse rest) (let ((k/v (car alist)) (tail (cdr alist))) (let ((key (car k/v)) (value (cdr k/v))) (fix-an-alist (acons (string->symbol key) (fix-alists value) rest) tail))))) (define (fix-a-vector vec) (list->vector (map fix-alists (vector->list vec)))) (cond ((list? data) (fix-an-alist '() data)) ((vector? data) (fix-a-vector data)) (else data))) (define (fixed:json-string->scm str) (with-exception-handler (lambda (err) (raise-not-json str err)) (lambda () (fix-alists (json-string->scm str))))) (export (fixed:json-string->scm . json-string->scm)) (define (fixed:json->scm port) (with-exception-handler (lambda (err) (raise-not-json "(input)" err)) (lambda () (fix-alists (json->scm port))))) (export (fixed:json->scm . json->scm)) (define fixed:scm->json-string scm->json-string) (export (fixed:scm->json-string . scm->json-string)) (define fixed:scm->json scm->json) (export (fixed:scm->json . scm->json))