@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 134 lines 3.7 kB view raw
1<?php 2 3final class PhabricatorAuthManagementRefreshWorkflow 4 extends PhabricatorAuthManagementWorkflow { 5 6 protected function didConstruct() { 7 $this 8 ->setName('refresh') 9 ->setExamples('**refresh**') 10 ->setSynopsis( 11 pht( 12 'Refresh OAuth access tokens. This is primarily useful for '. 13 'development and debugging.')) 14 ->setArguments( 15 array( 16 array( 17 'name' => 'user', 18 'param' => 'user', 19 'help' => pht('Refresh tokens for a given user.'), 20 ), 21 )); 22 } 23 24 public function execute(PhutilArgumentParser $args) { 25 $console = PhutilConsole::getConsole(); 26 $viewer = $this->getViewer(); 27 28 $query = id(new PhabricatorExternalAccountQuery()) 29 ->setViewer($viewer) 30 ->requireCapabilities( 31 array( 32 PhabricatorPolicyCapability::CAN_VIEW, 33 PhabricatorPolicyCapability::CAN_EDIT, 34 )); 35 36 $username = $args->getArg('user'); 37 if (phutil_nonempty_string($username)) { 38 $user = id(new PhabricatorPeopleQuery()) 39 ->setViewer($viewer) 40 ->withUsernames(array($username)) 41 ->executeOne(); 42 if ($user) { 43 $query->withUserPHIDs(array($user->getPHID())); 44 } else { 45 throw new PhutilArgumentUsageException( 46 pht('No such user "%s"!', $username)); 47 } 48 } 49 50 $accounts = $query->execute(); 51 52 if (!$accounts) { 53 throw new PhutilArgumentUsageException( 54 pht('No accounts match the arguments!')); 55 } else { 56 $console->writeOut( 57 "%s\n", 58 pht( 59 'Found %s account(s) to refresh.', 60 phutil_count($accounts))); 61 } 62 63 $providers = PhabricatorAuthProvider::getAllEnabledProviders(); 64 $providers = mpull($providers, null, 'getProviderConfigPHID'); 65 66 foreach ($accounts as $account) { 67 $console->writeOut( 68 "%s\n", 69 pht( 70 'Refreshing account #%d.', 71 $account->getID())); 72 73 $config_phid = $account->getProviderConfigPHID(); 74 if (empty($providers[$config_phid])) { 75 $console->writeOut( 76 "> %s\n", 77 pht('Skipping, provider is not enabled or does not exist.')); 78 continue; 79 } 80 81 $provider = $providers[$config_phid]; 82 if (!($provider instanceof PhabricatorOAuth2AuthProvider)) { 83 $console->writeOut( 84 "> %s\n", 85 pht('Skipping, provider is not an OAuth2 provider.')); 86 continue; 87 } 88 89 $adapter = $provider->getAdapter(); 90 if (!$adapter->supportsTokenRefresh()) { 91 $console->writeOut( 92 "> %s\n", 93 pht('Skipping, provider does not support token refresh.')); 94 continue; 95 } 96 97 $refresh_token = $account->getProperty('oauth.token.refresh'); 98 if (!$refresh_token) { 99 $console->writeOut( 100 "> %s\n", 101 pht('Skipping, provider has no stored refresh token.')); 102 continue; 103 } 104 105 $console->writeOut( 106 "+ %s\n", 107 pht( 108 'Refreshing token, current token expires in %s seconds.', 109 new PhutilNumber( 110 $account->getProperty('oauth.token.access.expires') - time()))); 111 112 $token = $provider->getOAuthAccessToken($account, $force_refresh = true); 113 if (!$token) { 114 $console->writeOut( 115 "* %s\n", 116 pht('Unable to refresh token!')); 117 continue; 118 } 119 120 $console->writeOut( 121 "+ %s\n", 122 pht( 123 'Refreshed token, new token expires in %s seconds.', 124 new PhutilNumber( 125 $account->getProperty('oauth.token.access.expires') - time()))); 126 127 } 128 129 $console->writeOut("%s\n", pht('Done.')); 130 131 return 0; 132 } 133 134}