git.fiddlerwoaroof.com
Browse code

bug: make open web console work reliably

Ed Langley authored on 23/12/2019 21:02:17
Showing 4 changed files
... ...
@@ -11,6 +11,8 @@
11 11
                  :aws-sdk/services/sts
12 12
                  :cells
13 13
                  :fset
14
+                 :dexador
15
+                 :quri
14 16
                  :cxml
15 17
                  :daydreamer
16 18
                  :fwoar-lisputils
... ...
@@ -67,17 +67,23 @@
67 67
 
68 68
 (defgeneric execute-action (action interface)
69 69
   (:method ((action (eql :|Open Web Console|)) (interface mfa-tool))
70
-    (open-url (signin-url interface)))
70
+    (let* ((credentials (current-credentials interface))
71
+           (parser (fw.lu:new 'sts-result-handler credentials))
72
+           (federation-url (url parser))
73
+           (signin-token (gethash "SigninToken"
74
+                                  (yason:parse
75
+                                   (dexador:get federation-url)))))
76
+      (open-url (url-from-signin-token signin-token))))
71 77
   (:method ((action (eql :|Authorize iTerm|)) (interface mfa-tool))
72
-    (uiop:run-program (format nil "osascript '~a'" 
73
-                              (probe-file 
74
-                               (merge-pathnames (make-pathname :name "AuthorizeShell" :type "scpt") 
78
+    (uiop:run-program (format nil "osascript '~a'"
79
+                              (probe-file
80
+                               (merge-pathnames (make-pathname :name "AuthorizeShell" :type "scpt")
75 81
                                                 (bundle-resource-root))))))
76 82
   (:method ((action (eql :|Cloudformation Stacks|)) (interface mfa-tool))
77
-   (let ((stack-interface (make-instance 'mfa-tool.stack:stack-interface
78
-                                         :credentials (current-credentials interface))))
79
-     (mfa-tool.store:dispatch stack-interface :|Get Stacks|)
80
-     (capi:display stack-interface)))
83
+    (let ((stack-interface (make-instance 'mfa-tool.stack:stack-interface
84
+                                          :credentials (current-credentials interface))))
85
+      (mfa-tool.store:dispatch stack-interface :|Get Stacks|)
86
+      (capi:display stack-interface)))
81 87
   (:method ((action (eql :|Lisp REPL|)) (interface mfa-tool))
82 88
     (capi:contain (make-instance 'capi:listener-pane)
83 89
                   :best-width 1280
... ...
@@ -171,11 +177,11 @@
171 177
         *accounts* (reprocess-accounts (load-accounts accounts))
172 178
         aws:*session* (mfa-tool.credential-provider:make-aws-session))
173 179
   (ubiquitous:restore :cj.mfa-tool)
174
-  (interface :default-account 
180
+  (interface :default-account
175 181
              (ubiquitous:value :default-account)))
176 182
 
177 183
 (defun start-in-repl
178
-    (&optional (accounts (asdf:system-relative-pathname :aws-access "accounts"
184
+    (&optional (accounts (asdf:system-relative-pathname :aws-access "assets/accounts"
179 185
                                                         :type "json")))
180 186
   (run accounts))
181 187
 
... ...
@@ -33,21 +33,24 @@
33 33
                                     (yason:encode params s))
34 34
                                   :space-to-plus t)))
35 35
 
36
-(cells:defmodel 
37
-    sts-result-handler ()
38
-  ((api-result :initarg :api-result :accessor api-result :initform (cells:c-in nil))
39
-   (credentials :reader credentials
40
-                :initform (cells:c? (serapeum:assocdr "Credentials" (^api-result)
41
-                                                      :test 'equal)))
36
+(cells:defmodel sts-result-handler ()
37
+  ((credentials :accessor credentials :initarg :credentials
38
+                :initform (cells:c-in nil))
42 39
    (session-id :reader session-id
43
-               :initform (cells:c? (serapeum:assocadr "AccessKeyId" (^credentials)
44
-                                                      :test 'equal)))
40
+               :initform (cells:c? (typecase (^credentials)
41
+                                     (aws:credentials (aws-sdk/credentials/base:credentials-access-key-id (^credentials)))
42
+                                     (cons (serapeum:assocadr "AccessKeyId" (^credentials)
43
+                                                              :test 'equal)))))
45 44
    (session-key :reader session-key 
46
-                :initform (cells:c? (serapeum:assocadr "SecretAccessKey" (^credentials)
47
-                                                       :test 'equal)))
45
+                :initform (cells:c? (typecase (^credentials)
46
+                                      (aws:credentials (aws-sdk/credentials/base:credentials-secret-access-key (^credentials)))
47
+                                      (cons (serapeum:assocadr "SecretAccessKey" (^credentials)
48
+                                                               :test 'equal)))))
48 49
    (session-token :reader session-token 
49
-                  :initform (cells:c? (serapeum:assocadr "SessionToken" (^credentials)
50
-                                                         :test 'equal)))
50
+                  :initform (cells:c? (typecase (^credentials)
51
+                                        (aws:credentials (aws-sdk/credentials/base:credentials-session-token (^credentials)))
52
+                                        (cons (serapeum:assocadr "SessionToken" (^credentials)
53
+                                                                 :test 'equal)))))
51 54
    (url-params :reader url-params 
52 55
                :initform (cells:c? (fw.lu:alist-string-hash-table
53 56
                                     `(("sessionId" . ,(^session-id))
... ...
@@ -93,8 +96,10 @@
93 96
                                      :test-function (lambda (c)
94 97
                                                       (and (find-restart 'continue)
95 98
                                                            (typep c 'aws:no-credentials)))))
96
-    (let* ((api-result (cells:c-in (do-auth user role token)))
97
-           (parser (make-instance 'sts-result-handler :api-result api-result))
99
+    (let* ((api-result (do-auth user role token))
100
+           (parser (make-instance 'sts-result-handler
101
+                                  :credentials (serapeum:assocdr "Credentials" api-result
102
+                                                                 :test 'equal)))
98 103
            (federation-url (url parser))
99 104
            (signin-token (gethash "SigninToken" 
100 105
                                   (yason:parse
... ...
@@ -11,4 +11,6 @@
11 11
                 #:cj-organization-role-arn
12 12
                 #:cj-developer-role
13 13
                 #:arn-for)
14
-  (:export :main))
14
+  (:export :main
15
+   :url
16
+           :sts-result-handler))