From a226d74133830c6efd78989d77f1b3c4d5016315 Mon Sep 17 00:00:00 2001 From: epriestley Date: Sat, 25 Apr 2020 13:58:08 -0700 Subject: [PATCH] Use "rest/api/3/myself" to retrieve JIRA profile details, not "rest/auth/1/session" Summary: Ref T13493. At time of writing, the old API method no longer functions: `1/session` does not return an `accountId` but all calls now require one. Use the modern `3/myself` API instead. The datastructure returned by `2/user` (older appraoch) and `3/myself` (newer approach) is more or less the same, as far as I can tell. Test Plan: Linked an account against modern-at-time-of-writing Atlassian-hosted JIRA. Maniphest Tasks: T13493 Differential Revision: https://secure.phabricator.com/D21170 --- .../auth/adapter/PhutilJIRAAuthAdapter.php | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/applications/auth/adapter/PhutilJIRAAuthAdapter.php b/src/applications/auth/adapter/PhutilJIRAAuthAdapter.php index 2796577148..a18b39690b 100644 --- a/src/applications/auth/adapter/PhutilJIRAAuthAdapter.php +++ b/src/applications/auth/adapter/PhutilJIRAAuthAdapter.php @@ -10,7 +10,6 @@ final class PhutilJIRAAuthAdapter extends PhutilOAuth1AuthAdapter { private $jiraBaseURI; private $adapterDomain; - private $currentSession; private $userInfo; public function setJIRABaseURI($jira_base_uri) { @@ -106,21 +105,34 @@ final class PhutilJIRAAuthAdapter extends PhutilOAuth1AuthAdapter { private function getUserInfo() { if ($this->userInfo === null) { - $this->currentSession = $this->newJIRAFuture('rest/auth/1/session', 'GET') - ->resolveJSON(); - - // The session call gives us the username, but not the user key or other - // information. Make a second call to get additional information. + $this->userInfo = $this->newUserInfo(); + } - $params = array( - 'username' => $this->currentSession['name'], - ); + return $this->userInfo; + } - $this->userInfo = $this->newJIRAFuture('rest/api/2/user', 'GET', $params) + private function newUserInfo() { + // See T13493. Try a relatively modern (circa early 2020) API call first. + try { + return $this->newJIRAFuture('rest/api/3/myself', 'GET') ->resolveJSON(); + } catch (Exception $ex) { + // If we failed the v3 call, assume the server version is too old + // to support this API and fall back to trying the older method. } - return $this->userInfo; + $session = $this->newJIRAFuture('rest/auth/1/session', 'GET') + ->resolveJSON(); + + // The session call gives us the username, but not the user key or other + // information. Make a second call to get additional information. + + $params = array( + 'username' => $session['name'], + ); + + return $this->newJIRAFuture('rest/api/2/user', 'GET', $params) + ->resolveJSON(); } public static function newJIRAKeypair() { -- 2.51.2