private function setAccountKeyAndContinue(PhabricatorExternalAccount $account, $next_uri)
 {
     if ($account->getUserPHID()) {
         throw new Exception(pht('Account is already registered or linked.'));
     }
     // Regenerate the registration secret key, set it on the external account,
     // set a cookie on the user's machine, and redirect them to registration.
     // See PhabricatorAuthRegisterController for discussion of the registration
     // key.
     $registration_key = Filesystem::readRandomCharacters(32);
     $account->setProperty('registrationKey', PhabricatorHash::digest($registration_key));
     $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
     $account->save();
     unset($unguarded);
     $this->getRequest()->setTemporaryCookie(PhabricatorCookies::COOKIE_REGISTRATION, $registration_key);
     return id(new AphrontRedirectResponse())->setURI($next_uri);
 }
 protected function synchronizeOAuthAccount(PhabricatorExternalAccount $account)
 {
     $adapter = $this->getAdapter();
     $oauth_token = $adapter->getAccessToken();
     $account->setProperty('oauth.token.access', $oauth_token);
     if ($adapter->supportsTokenRefresh()) {
         $refresh_token = $adapter->getRefreshToken();
         $account->setProperty('oauth.token.refresh', $refresh_token);
     } else {
         $account->setProperty('oauth.token.refresh', null);
     }
     $expires = $adapter->getAccessTokenExpires();
     $account->setProperty('oauth.token.access.expires', $expires);
 }
 protected function synchronizeOAuthAccount(PhabricatorExternalAccount $account)
 {
     $adapter = $this->getAdapter();
     $oauth_token = $adapter->getToken();
     $oauth_token_secret = $adapter->getTokenSecret();
     $account->setProperty('oauth1.token', $oauth_token);
     $account->setProperty('oauth1.token.secret', $oauth_token_secret);
 }