From 950a71a7e89efe48804a89322f9a974610d40770 Mon Sep 17 00:00:00 2001 From: Johnson Denen Date: Sun, 23 Apr 2017 00:51:49 -0400 Subject: Rewrite mastodon-auth - Remove client functions - Use mastodon-http--post - No more callback spaghetti --- lisp/mastodon-auth.el | 159 ++++++++++---------------------------------------- 1 file changed, 32 insertions(+), 127 deletions(-) (limited to 'lisp/mastodon-auth.el') diff --git a/lisp/mastodon-auth.el b/lisp/mastodon-auth.el index 69404ac..09813d3 100644 --- a/lisp/mastodon-auth.el +++ b/lisp/mastodon-auth.el @@ -28,140 +28,45 @@ ;;; Code: (require 'plstore) -(require 'mastodon-http) +(require 'mastodon-client) (defgroup mastodon-auth nil "Authenticate with Mastodon." :prefix "mastodon-auth-" :group 'mastodon) -(defvar mastodon--client-app-plist nil) -(defvar mastodon--api-token-string nil) - -(defun mastodon-auth--token-file () - "Returns `mastodon-token-file' string." - mastodon-token-file) - -(defun mastodon-auth--registration-success () - (let ((client-data (mastodon--json-hash-table))) - (setq mastodon--client-app-plist - `(:client_id - ,(gethash "client_id" client-data) - :client_secret - ,(gethash "client_secret" client-data))))) - -(defun mastodon--register-client-app-triage (status) - "Callback function to triage `mastodon--register-client-app' response. - -STATUS is passed by `url-retrieve'." - (mastodon--http-response-triage status - 'mastodon-auth--registration-success)) - -(defun mastodon--register-client-app () - "Add `:client_id' and `client_secret' to `mastodon--client-plist'." - (mastodon--http-post (mastodon--api-for "apps") - 'mastodon--register-client-app-triage - '(("client_name" . "mastodon.el") - ("redirect_uris" . "urn:ietf:wg:oauth:2.0:oob") - ("scopes" . "read write follow") - ("website" . "https://github.com/jdenen/mastodon.el")))) - -(defun mastodon-auth--client-app-secret-p () - "Return t if `mastodon--client-app-plist' has a :client_secret value." - (when (plist-get mastodon--client-app-plist :client_secret) t)) - -(defun mastodon-auth--client () - "Return `mastodon--client-app-plist' value." - mastodon--client-app-plist) - -(defun mastodon--register-and-return-client-app () - "Register `mastodon' with an instance. Return `mastodon--client-app-plist'." - (if (mastodon-auth--client-app-secret-p) - (mastodon-auth--client) - (progn - (mastodon--register-client-app) - (sleep-for 2) - (mastodon--register-and-return-client-app)))) - -(defun mastodon--store-client-id-and-secret () - "Store `:client_id' and `:client_secret' in a plstore." - (let ((client-plist (mastodon--register-and-return-client-app)) - (plstore (plstore-open (mastodon-auth--token-file)))) - (plstore-put plstore "mastodon" `(:client_id - ,(plist-get client-plist :client_id) - :client_secret - ,(plist-get client-plist :client_secret)) - nil) - (plstore-save plstore) - client-plist)) - -(defun mastodon--client-app () - "Return `mastodon--client-app-plist'. - -If not set, retrieves client data from `mastodon-token-file'. -If no data can be found in the token file, registers the app and stores its data via `mastodon--store-client-id-and-secret'." - (if (plist-get mastodon--client-app-plist :client_secret) - mastodon--client-app-plist - (let* ((plstore (plstore-open (mastodon-auth--token-file))) - (mastodon (plstore-get plstore "mastodon"))) - (if mastodon - (progn - (setq mastodon--client-app-plist (delete "mastodon" mastodon)) - mastodon--client-app-plist) - (progn - (setq mastodon--client-app-plist (mastodon--store-client-id-and-secret)) - mastodon--client-app-plist))))) - -(defun mastodon-auth--get-token-success () - (let ((token-data (mastodon--json-hash-table))) - (progn - (setq mastodon--api-token-string (gethash "access_token" token-data)) - mastodon--api-token-string))) - -(defun mastodon--get-access-token-triage (status) - "Callback function to triage `mastodon--get-access-token' response. - -STATUS is passed by `url-retrieve'." - (mastodon--http-response-triage status - 'mastodon-auth--get-token-success)) - -(defun mastodon-auth--user-and-passwd () - "Prompt for user email and password." - (let ((email (read-string "Email: ")) - (passwd (read-passwd "Password: "))) - (cons email passwd))) - -(defun mastodon--get-access-token () - "Retrieve access token from instance. - -Authenticates with email address and password. Neither are not stored." - (let* ((creds (mastodon-auth--user-and-passwd)) - (email (car creds)) - (passwd (cdr creds))) - (mastodon--http-post (concat mastodon-instance-url "/oauth/token") - 'mastodon--get-access-token-triage - `(("client_id" . ,(plist-get (mastodon--client-app) :client_id)) - ("client_secret" . ,(plist-get (mastodon--client-app) :client_secret)) - ("grant_type" . "password") - ("username" . ,email) - ("password" . ,passwd) - ("scope" . "read write follow"))))) - -(defun mastodon-auth--token () - "Return `mastodon--api-token-string'." - mastodon--api-token-string) - -(defun mastodon--access-token () - "Return `mastodon--api-token-string'. - -If not set, retrieves token with `mastodon--get-access-token'." - (or (mastodon-auth--token) +(defvar mastodon-auth--token nil + "") + +(defun mastodon-auth--generate-token () + "" + (mastodon-http--post + (concat mastodon-instance-url "/oauth/token") + `(("client_id" . ,(plist-get (mastodon-client) :client_id)) + ("client_secret" . ,(plist-get (mastodon-client) :client_secret)) + ("grant_type" . "password") + ("username" . ,(read-string "Email: ")) + ("password" . ,(read-passwd "Password: ")) + ("scope" . "read write follow")) + nil)) + +(defun mastodon-auth--get-token () + "" + (with-current-buffer (mastodon-auth--generate-token) + (goto-char (point-min)) + (re-search-forward "^$" nil 'move) + (let ((json-object-type 'plist) + (json-key-type 'keyword) + (json-array-type 'vector) + (json-string (buffer-substring-no-properties (point) (point-max)))) + (json-read-from-string json-string)))) + +(defun mastodon-auth--access-token () + (or mastodon-auth--token (progn - (mastodon--get-access-token) - (or (mastodon-auth--token) - (progn - (sleep-for 2) - (mastodon--access-token)))))) + (let* ((json (mastodon-auth--get-token)) + (token (plist-get json :access_token))) + (setq mastodon-auth--token token))))) (provide 'mastodon-auth) ;;; mastodon-auth.el ends here -- cgit v1.2.3