summaryrefslogtreecommitdiff
path: root/tests/client-authorization.scm
blob: ed02edf8e4f2b7177f92b99bd092c8675cf493ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
(use-modules (webid-oidc client)
             (webid-oidc testing)
             ((webid-oidc stubs) #:prefix stubs:)
             (web uri)
             (web response)
             (srfi srfi-19)
             (ice-9 optargs)
             (ice-9 receive)
             (ice-9 hash-table))

;; We need to test different things.

;; 1. It works when passed a host
;; 2. It works when passed a webid with foreign identity providers
;; 3. It works when passed a webid without foreign identity providers

(with-test-environment
 "client-authorization"
 (lambda ()
   (define* (http-get uri #:key (headers '()))
     (cond
      ;; 1. We pass a host name
      ((equal? uri (string->uri "https://case-1.client-authorization.scm/.well-known/openid-configuration"))
       (values
        (build-response #:headers `((content-type application/json)))
        (stubs:scm->json-string
         `((jwks_uri . "https://case-1.client-authorization.scm/keys")
           (authorization_endpoint . "https://case-1.client-authorization.scm/authorize")
           (token_endpoint . "https://case-1.client-authorization.scm/token")))))
      ;; It’s not a webid
      ((equal? uri (string->uri "https://case-1.client-authorization.scm"))
       (values
        (build-response #:code 404 #:reason-phrase "Not Found")
        #f))
      ;; 2. We first dereference the webid
      ((equal? uri (string->uri "https://case-2.client-authorization.scm/profile/card#me"))
       (values
        (build-response #:headers `((content-type text/turtle)))
        "<#me> <http://www.w3.org/ns/solid/terms#oidcIssuer> <https://one.identity.provider>, <https://another.identity.provider> ."))
      ;; and we get the config of all IPs
      ((equal? uri (string->uri "https://case-2.client-authorization.scm/.well-known/openid-configuration"))
       (values
        (build-response #:headers `((content-type application/json)))
        (stubs:scm->json-string
         `((jwks_uri . "https://case-2.client-authorization.scm/keys")
           (authorization_endpoint . "https://case-2.client-authorization.scm/authorize")
           (token_endpoint . "https://case-2.client-authorization.scm/token")))))
      ((equal? uri (string->uri "https://one.identity.provider/.well-known/openid-configuration"))
       (values
        (build-response #:headers `((content-type application/json)))
        (stubs:scm->json-string
         `((jwks_uri . "https://one.identity.provider/keys")
           (authorization_endpoint . "https://one.identity.provider/authorize")
           (token_endpoint . "https://one.identity.provider/token")))))
      ((equal? uri (string->uri "https://another.identity.provider/.well-known/openid-configuration"))
       (values
        (build-response #:headers `((content-type application/json)))
        (stubs:scm->json-string
         `((jwks_uri . "https://another.identity.provider/keys")
           (authorization_endpoint . "https://another.identity.provider/authorize")
           (token_endpoint . "https://another.identity.provider/token")))))
      ;; 3. The webid has no IPs.
      ((equal? uri (string->uri "https://case-3.client-authorization.scm/profile/card#me"))
       (values
        (build-response #:headers `((content-type text/turtle)))
        ""))
      ;; so we query the host of the webid.
      ((equal? uri (string->uri "https://case-3.client-authorization.scm/.well-known/openid-configuration"))
       (values
        (build-response #:headers `((content-type application/json)))
        (stubs:scm->json-string
         `((jwks_uri . "https://case-3.client-authorization.scm/keys")
           (authorization_endpoint . "https://case-3.client-authorization.scm/authorize")
           (token_endpoint . "https://case-3.client-authorization.scm/token")))))
      (else
       (format (current-error-port) "Unexpected GET query of URI ~a.\n" (uri->string uri))
       (exit 1))))
   (let ((case-1 (authorize "case-1.client-authorization.scm"
                            #:client-id "https://app.client-authorization.scm"
                            #:redirect-uri "https://app.client-authorization.scm/redirected"
                            #:state "integrity&check"
                            #:http-get http-get))
         (case-2 (authorize "https://case-2.client-authorization.scm/profile/card#me"
                            #:client-id "https://app.client-authorization.scm"
                            #:redirect-uri "https://app.client-authorization.scm/redirected"
                            #:state "integrity&check"
                            #:http-get http-get))
         (case-3 (authorize "https://case-3.client-authorization.scm/profile/card#me"
                            #:client-id "https://app.client-authorization.scm"
                            #:redirect-uri "https://app.client-authorization.scm/redirected"
                            #:state "integrity&check"
                            #:http-get http-get))
         (expected-1
          `(("https://case-1.client-authorization.scm"
             . ,(string->uri "https://case-1.client-authorization.scm/authorize?client_id=https%3A%2F%2Fapp.client-authorization.scm&redirect_uri=https%3A%2F%2Fapp.client-authorization.scm%2Fredirected&state=integrity%26check"))))
         (expected-2
          `(("https://case-2.client-authorization.scm"
             . ,(string->uri "https://case-2.client-authorization.scm/authorize?client_id=https%3A%2F%2Fapp.client-authorization.scm&redirect_uri=https%3A%2F%2Fapp.client-authorization.scm%2Fredirected&state=integrity%26check"))
            ("https://one.identity.provider"
             . ,(string->uri "https://one.identity.provider/authorize?client_id=https%3A%2F%2Fapp.client-authorization.scm&redirect_uri=https%3A%2F%2Fapp.client-authorization.scm%2Fredirected&state=integrity%26check"))
            ("https://another.identity.provider"
             . ,(string->uri "https://another.identity.provider/authorize?client_id=https%3A%2F%2Fapp.client-authorization.scm&redirect_uri=https%3A%2F%2Fapp.client-authorization.scm%2Fredirected&state=integrity%26check"))))
         (expected-3
          `(("https://case-3.client-authorization.scm"
             . ,(string->uri "https://case-3.client-authorization.scm/authorize?client_id=https%3A%2F%2Fapp.client-authorization.scm&redirect_uri=https%3A%2F%2Fapp.client-authorization.scm%2Fredirected&state=integrity%26check")))))
     (unless (equal? case-1 expected-1)
       (format (current-error-port) "Case 1 failed:\n~s\n~s\n\n"
               case-1 expected-1)
       (exit 2))
     (unless (equal? (hash-map->list cons (alist->hash-table case-2))
                     (hash-map->list cons (alist->hash-table expected-2)))
       (format (current-error-port) "Case 2 failed:\n~s\n~s\n\n"
               case-2 expected-2)
       (exit 3))
     (unless (equal? case-3 expected-3)
       (format (current-error-port) "Case 3 failed:\n~s\n~s\n\n"
               case-3 expected-3)
       (exit 4)))))