X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=app%2FController%2FGithub%2FCallback.php;h=2347d0e67069ca946dbea6c924af10e59b312f06;hb=96da0fd4e37ae211394415d381413514edece6c7;hp=1b7f34f1ce1651ff1f43827db0ea7e2c3680c560;hpb=eb76e9bb9a39fe2725301f6cf6fc3cf29bbc4e00;p=pharext%2Fpharext.org diff --git a/app/Controller/Github/Callback.php b/app/Controller/Github/Callback.php index 1b7f34f..2347d0e 100644 --- a/app/Controller/Github/Callback.php +++ b/app/Controller/Github/Callback.php @@ -4,14 +4,13 @@ namespace app\Controller\Github; use app\Controller\Github; use app\Github\API; -use app\Github\Exception; use app\Model\Accounts; use app\Session; use app\Web; +use http\Cookie; class Callback extends Github { - /** * @var Accounts */ @@ -24,43 +23,51 @@ class Callback extends Github function __invoke(array $args = null) { if ($this->app->getRequest()->getQuery("error")) { - $this->app->getView()->addData([ - "error" => $this->app->getRequest()->getQuery("error_description") - ]); + $this->app->getView()->addData($this->app->getRequest()->getQuery()->toArray()); } else { - $this->github->fetchToken( - $this->app->getRequest()->getQuery("code"), - $this->app->getRequest()->getQuery("state"), - function($token) { - $this->github->setToken($token->access_token); - $this->github->readAuthUser($this->createUserCallback($token)); - })->send(); + $this->validateUser(); + if (isset($this->session->returnto)) { $returnto = $this->session->returnto; unset($this->session->returnto); $this->app->redirect($returnto); } else { $this->app->redirect( - $this->app->getBaseUrl()->mod("./github")); + $this->app->getBaseUrl()->mod(":./github")); } } $this->app->display("github/callback"); } - function createUserCallback($token) { - return function($user) use($token) { - $tx = $this->accounts->getConnection()->startTransaction(); - - if (!($account = $this->accounts->byOAuth("github", $token->access_token, $user->login))) { - $account = $this->accounts->createOAuthAccount("github", $token->access_token, $user->login); - } - $account->updateToken("github", $token->access_token, $token); - $owner = $account->updateOwner("github", $user->login, $user); - - $tx->commit(); - - $this->session->account = $account->account->get(); - $this->session->github = (object) $owner->export(); - }; + private function validateUser() { + $this->github->fetchToken( + $this->app->getRequest()->getQuery("code"), + $this->app->getRequest()->getQuery("state") + )->then(function($result) use (&$oauth) { + list($oauth) = $result; + $this->github->setToken($oauth->access_token); + return $this->github->readAuthUser(); + })->done(function($result) use(&$oauth) { + list($user) = $result; + $this->login(...$this->persistUser($oauth, $user)); + }); + + $this->github->drain(); + } + + private function persistUser($oauth, $user) { + $tx = $this->accounts->getConnection()->startTransaction(); + + if (($cookie = $this->app->getRequest()->getCookie("account"))) { + $account = $this->accounts->find(["account=" => $cookie])->current(); + } elseif (!($account = $this->accounts->byOAuth("github", $oauth->access_token, $user->login))) { + $account = $this->accounts->createOAuthAccount("github", $oauth->access_token, $user->login); + } + $token = $account->updateToken("github", $oauth->access_token, $oauth); + $owner = $account->updateOwner("github", $user->login, $user); + + $tx->commit(); + + return [$account, $token, $owner]; } }