(defpackage :mfa-tool.read-credentials
(:use :cl)
(:export #:access-key
#:secret-access-key
#:credential-update
#:prompt-for-aws-credentials))
(in-package :mfa-tool.read-credentials)
(defvar *store*)
(defun column (attrs &rest children)
(apply 'make-instance 'capi:column-layout
:children children
attrs))
(defun row (attrs &rest children)
(apply 'make-instance 'capi:row-layout
:children children
attrs))
(defun dispatch-with-action-creator (action-creator)
(let ((store *store*))
(lambda (data)
(mfa-tool.store:dispatch store
(funcall action-creator data)))))
(defun dispatch-with-item (store)
(lambda (data)
(mfa-tool.store:dispatch store data)))
(defun list-panel (action attrs items)
(apply 'make-instance 'capi:list-panel
:items items
:selection-callback (dispatch-with-action-creator action)
:callback-type :data
attrs))
(defun select (action attrs items)
(apply 'make-instance 'capi:option-pane
:items items
:selection-callback (dispatch-with-action-creator action)
:callback-type :data
attrs))
(defun text-input (action attrs &optional (text ""))
(apply 'make-instance 'capi:text-input-pane
:text text
:change-callback (dispatch-with-action-creator action)
attrs))
(defun button-panel (attrs &rest items)
(apply 'make-instance 'capi:push-button-panel
:items items
:selection-callback (dispatch-with-item *store*)
:callback-type :data
attrs))
(defclass update-access-key ()
((%key :initarg :key :reader key)))
(defun update-access-key (key)
(fw.lu:new 'update-access-key key))
(defclass update-secret-access-key ()
((%key :initarg :key :reader key)))
(defun update-secret-access-key (key)
(fw.lu:new 'update-secret-access-key key))
(defun layout ()
(column ()
(make-instance 'capi:grid-layout
:x-adjust :right
:y-adjust :center
:description
(list "Access Key:"
(text-input 'update-access-key
())
"Secret Access Key:"
(text-input 'update-secret-access-key
(list :min-width '(:character 45)
:callback-type nil
:callback (alexandria:compose
(dispatch-with-item *store*)
(lambda () :|Ok|))))))
(row ()
nil
(button-panel '(:default-button :|Ok|
:cancel-button :|Cancel|
:accepts-focus-p t)
:|Cancel|
:|Ok|))))
(defclass credential-input-store (mfa-tool.store:store)
((access-key :accessor access-key)
(secret-access-key :accessor secret-access-key)
(%done-cb :writer bind :reader done-callback)))
(defun done-callback-p (store)
(slot-boundp store '%done-cb))
(fw.lu:defclass+ credential-update ()
((access-key :reader access-key :initarg :access-key)
(secret-access-key :accessor secret-access-key :initarg :secret-access-key)))
(defmethod mfa-tool.store:execute ((store credential-input-store) (action update-access-key))
(setf (access-key store) (key action)))
(defmethod mfa-tool.store:execute ((store credential-input-store) (action update-secret-access-key))
(setf (secret-access-key store) (key action)))
(defmethod print-object ((object credential-update) s)
(print-unreadable-object (object s :type t :identity t)
(format s "~s ~s"
(access-key object)
(secret-access-key object))))
(defmethod mfa-tool.store:dispatch :after ((store credential-input-store) (action (eql :|Ok|)))
(fw.lu:with-accessors* (access-key secret-access-key) store
(let ((credential-update (credential-update access-key secret-access-key)))
(mfa-tool.store:propagate store credential-update)
(capi:exit-dialog credential-update))))
(defmethod mfa-tool.store:dispatch :after ((store credential-input-store) (action (eql :|Cancel|)))
(capi:abort-dialog))
(defun prompt-for-aws-credentials (next-store)
(let* ((*store* (make-instance 'credential-input-store :next-store next-store))
(interface (make-instance 'capi:interface
:layout (layout)
:title "Enter Credentials")))
(capi:display-dialog interface)))
|