Make OAuth client authorizations a Settings panel
Summary: This modernizes and simplifies OAuth client authorizations a bit, moving them to a settings panel similar to the "Sessions" panel.
Test Plan:
- Viewed authorizations.
- Revoked an authorization.
- Created a test authorization.
{F131196}
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Differential Revision: https://secure.phabricator.com/D8561
This commit is contained in:
@@ -10,14 +10,6 @@ final class PhabricatorOAuthServerConsoleController
|
||||
$menu = id(new PHUIObjectItemListView())
|
||||
->setUser($viewer);
|
||||
|
||||
$menu->addItem(
|
||||
id(new PHUIObjectItemView())
|
||||
->setHeader(pht('Authorizations'))
|
||||
->setHref($this->getApplicationURI('clientauthorization/'))
|
||||
->addAttribute(
|
||||
pht(
|
||||
'Review your authorizations.')));
|
||||
|
||||
$menu->addItem(
|
||||
id(new PHUIObjectItemView())
|
||||
->setHeader(pht('Applications'))
|
||||
|
||||
@@ -12,9 +12,6 @@ extends PhabricatorController {
|
||||
|
||||
$nav = new AphrontSideNavFilterView();
|
||||
$nav->setBaseURI(new PhutilURI('/oauthserver/'));
|
||||
$nav->addLabel('Client Authorizations');
|
||||
$nav->addFilter('clientauthorization',
|
||||
'My Authorizations');
|
||||
$nav->addLabel('Clients');
|
||||
$nav->addFilter('client/create',
|
||||
'Create Client');
|
||||
|
||||
@@ -17,37 +17,39 @@ extends PhabricatorOAuthServerController {
|
||||
$panels = array();
|
||||
$results = array();
|
||||
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$action = $request->getStr('action');
|
||||
switch ($action) {
|
||||
case 'testclientauthorization':
|
||||
$user_phid = $current_user->getPHID();
|
||||
$client_phid = $request->getStr('client_phid');
|
||||
$client = id(new PhabricatorOAuthServerClient)
|
||||
->loadOneWhere('phid = %s', $client_phid);
|
||||
if (!$client) {
|
||||
throw new Exception('Failed to load client!');
|
||||
}
|
||||
if ($client->getCreatorPHID() != $user_phid ||
|
||||
$current_user->getPHID() != $user_phid) {
|
||||
throw new Exception(
|
||||
'Only allowed to make test data for yourself '.
|
||||
'for clients you own!'
|
||||
);
|
||||
}
|
||||
// blankclientauthorizations don't get scope
|
||||
$scope = array();
|
||||
$server->setUser($current_user);
|
||||
$server->setClient($client);
|
||||
$authorization = $server->authorizeClient($scope);
|
||||
return id(new AphrontRedirectResponse())
|
||||
->setURI('/oauthserver/clientauthorization/?edited='.
|
||||
$authorization->getPHID());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!$request->isFormPost()) {
|
||||
return new Aphront400Response();
|
||||
}
|
||||
|
||||
$action = $request->getStr('action');
|
||||
if ($action !== 'testclientauthorization') {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
$user_phid = $current_user->getPHID();
|
||||
$client_phid = $request->getStr('client_phid');
|
||||
$client = id(new PhabricatorOAuthServerClient)
|
||||
->loadOneWhere('phid = %s', $client_phid);
|
||||
if (!$client) {
|
||||
throw new Exception('Failed to load client!');
|
||||
}
|
||||
if ($client->getCreatorPHID() != $user_phid ||
|
||||
$current_user->getPHID() != $user_phid) {
|
||||
throw new Exception(
|
||||
'Only allowed to make test data for yourself '.
|
||||
'for clients you own!'
|
||||
);
|
||||
}
|
||||
|
||||
// blankclientauthorizations don't get scope
|
||||
$scope = array();
|
||||
$server->setUser($current_user);
|
||||
$server->setClient($client);
|
||||
$authorization = $server->authorizeClient($scope);
|
||||
|
||||
$id = $authorization->getID();
|
||||
$panel_uri = '/settings/panel/oauthorizations/?id='.$id;
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI($panel_uri);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @group oauthserver
|
||||
*/
|
||||
abstract class PhabricatorOAuthClientAuthorizationBaseController
|
||||
extends PhabricatorOAuthServerController {
|
||||
|
||||
private $authorizationPHID;
|
||||
protected function getAuthorizationPHID() {
|
||||
return $this->authorizationPHID;
|
||||
}
|
||||
private function setAuthorizationPHID($phid) {
|
||||
$this->authorizationPHID = $phid;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function shouldRequireLogin() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function willProcessRequest(array $data) {
|
||||
$this->setAuthorizationPHID(idx($data, 'phid'));
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @group oauthserver
|
||||
*/
|
||||
final class PhabricatorOAuthClientAuthorizationDeleteController
|
||||
extends PhabricatorOAuthClientAuthorizationBaseController {
|
||||
|
||||
public function processRequest() {
|
||||
$phid = $this->getAuthorizationPHID();
|
||||
$title = 'Delete OAuth Client Authorization';
|
||||
$request = $this->getRequest();
|
||||
$current_user = $request->getUser();
|
||||
$authorization = id(new PhabricatorOAuthClientAuthorization())
|
||||
->loadOneWhere('phid = %s',
|
||||
$phid);
|
||||
|
||||
if (empty($authorization)) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
if ($authorization->getUserPHID() != $current_user->getPHID()) {
|
||||
$message = 'Access denied to client authorization with phid '.$phid.'. '.
|
||||
'Only the user who authorized the client has permission to '.
|
||||
'delete the authorization.';
|
||||
return id(new Aphront403Response())
|
||||
->setForbiddenText($message);
|
||||
}
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$authorization->delete();
|
||||
return id(new AphrontRedirectResponse())
|
||||
->setURI('/oauthserver/clientauthorization/?notice=deleted');
|
||||
}
|
||||
|
||||
$client_phid = $authorization->getClientPHID();
|
||||
$client = id(new PhabricatorOAuthServerClient())
|
||||
->loadOneWhere('phid = %s',
|
||||
$client_phid);
|
||||
if ($client) {
|
||||
$title .= ' for '.$client->getName();
|
||||
} else {
|
||||
// the client does not exist so token is dead already (but
|
||||
// let's let the user clean this up anyway in that case)
|
||||
}
|
||||
|
||||
$dialog = new AphrontDialogView();
|
||||
$dialog->setUser($current_user);
|
||||
$dialog->setTitle($title);
|
||||
$dialog->appendChild(phutil_tag('p', array(), pht(
|
||||
'Are you sure you want to delete this client authorization?')));
|
||||
$dialog->addSubmitButton();
|
||||
$dialog->addCancelButton($authorization->getEditURI());
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @group oauthserver
|
||||
*/
|
||||
final class PhabricatorOAuthClientAuthorizationEditController
|
||||
extends PhabricatorOAuthClientAuthorizationBaseController {
|
||||
|
||||
public function processRequest() {
|
||||
$phid = $this->getAuthorizationPHID();
|
||||
$title = 'Edit OAuth Client Authorization';
|
||||
$request = $this->getRequest();
|
||||
$current_user = $request->getUser();
|
||||
$authorization = id(new PhabricatorOAuthClientAuthorization())
|
||||
->loadOneWhere('phid = %s',
|
||||
$phid);
|
||||
|
||||
if (empty($authorization)) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
if ($authorization->getUserPHID() != $current_user->getPHID()) {
|
||||
$message = 'Access denied to client authorization with phid '.$phid.'. '.
|
||||
'Only the user who authorized the client has permission to '.
|
||||
'edit the authorization.';
|
||||
return id(new Aphront403Response())
|
||||
->setForbiddenText($message);
|
||||
}
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$scopes = PhabricatorOAuthServerScope::getScopesFromRequest($request);
|
||||
$authorization->setScope($scopes);
|
||||
$authorization->save();
|
||||
return id(new AphrontRedirectResponse())
|
||||
->setURI('/oauthserver/clientauthorization/?edited='.$phid);
|
||||
}
|
||||
|
||||
$client_phid = $authorization->getClientPHID();
|
||||
$client = id(new PhabricatorOAuthServerClient())
|
||||
->loadOneWhere('phid = %s',
|
||||
$client_phid);
|
||||
|
||||
$created = phabricator_datetime($authorization->getDateCreated(),
|
||||
$current_user);
|
||||
$updated = phabricator_datetime($authorization->getDateModified(),
|
||||
$current_user);
|
||||
|
||||
$panel = new AphrontPanelView();
|
||||
$delete_button = phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $authorization->getDeleteURI(),
|
||||
'class' => 'grey button',
|
||||
),
|
||||
'Delete OAuth Client Authorization');
|
||||
$panel->addButton($delete_button);
|
||||
$panel->setHeader($title);
|
||||
|
||||
$form = id(new AphrontFormView())
|
||||
->setUser($current_user)
|
||||
->appendChild(
|
||||
id(new AphrontFormMarkupControl())
|
||||
->setLabel('Client')
|
||||
->setValue(
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $client->getViewURI(),
|
||||
),
|
||||
$client->getName())))
|
||||
->appendChild(
|
||||
id(new AphrontFormStaticControl())
|
||||
->setLabel('Created')
|
||||
->setValue($created))
|
||||
->appendChild(
|
||||
id(new AphrontFormStaticControl())
|
||||
->setLabel('Last Updated')
|
||||
->setValue($updated))
|
||||
->appendChild(
|
||||
PhabricatorOAuthServerScope::getCheckboxControl(
|
||||
$authorization->getScope()))
|
||||
->appendChild(
|
||||
id(new AphrontFormSubmitControl())
|
||||
->setValue('Save OAuth Client Authorization')
|
||||
->addCancelButton('/oauthserver/clientauthorization/'));
|
||||
|
||||
$panel->appendChild($form);
|
||||
return $this->buildStandardPageResponse(
|
||||
$panel,
|
||||
array('title' => $title));
|
||||
}
|
||||
}
|
||||
@@ -1,150 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @group oauthserver
|
||||
*/
|
||||
final class PhabricatorOAuthClientAuthorizationListController
|
||||
extends PhabricatorOAuthClientAuthorizationBaseController {
|
||||
|
||||
protected function getFilter() {
|
||||
return 'clientauthorization';
|
||||
}
|
||||
|
||||
public function processRequest() {
|
||||
$title = 'OAuth Client Authorizations';
|
||||
$request = $this->getRequest();
|
||||
$current_user = $request->getUser();
|
||||
$offset = $request->getInt('offset', 0);
|
||||
$page_size = 100;
|
||||
$pager = new AphrontPagerView();
|
||||
$request_uri = $request->getRequestURI();
|
||||
$pager->setURI($request_uri, 'offset');
|
||||
$pager->setPageSize($page_size);
|
||||
$pager->setOffset($offset);
|
||||
|
||||
$query = id(new PhabricatorOAuthClientAuthorizationQuery())
|
||||
->setViewer($current_user)
|
||||
->withUserPHIDs(array($current_user->getPHID()));
|
||||
$authorizations = $query->executeWithOffsetPager($pager);
|
||||
|
||||
$client_authorizations = mpull($authorizations, null, 'getClientPHID');
|
||||
$client_phids = array_keys($client_authorizations);
|
||||
if ($client_phids) {
|
||||
$clients = id(new PhabricatorOAuthServerClient())
|
||||
->loadAllWhere('phid in (%Ls)',
|
||||
$client_phids);
|
||||
} else {
|
||||
$clients = array();
|
||||
}
|
||||
$client_dict = mpull($clients, null, 'getPHID');
|
||||
|
||||
$rows = array();
|
||||
$rowc = array();
|
||||
$highlight = $this->getHighlightPHIDs();
|
||||
foreach ($client_authorizations as $client_phid => $authorization) {
|
||||
$client = $client_dict[$client_phid];
|
||||
$created = phabricator_datetime($authorization->getDateCreated(),
|
||||
$current_user);
|
||||
$updated = phabricator_datetime($authorization->getDateModified(),
|
||||
$current_user);
|
||||
$scope_doc_href = PhabricatorEnv::getDoclink(
|
||||
'Using the Phabricator OAuth Server');
|
||||
$row = array(
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $client->getViewURI(),
|
||||
),
|
||||
$client->getName()),
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $scope_doc_href,
|
||||
),
|
||||
$authorization->getScopeString()),
|
||||
phabricator_datetime(
|
||||
$authorization->getDateCreated(),
|
||||
$current_user),
|
||||
phabricator_datetime(
|
||||
$authorization->getDateModified(),
|
||||
$current_user),
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'class' => 'small button grey',
|
||||
'href' => $authorization->getEditURI(),
|
||||
),
|
||||
'Edit'),
|
||||
);
|
||||
|
||||
$rows[] = $row;
|
||||
if (isset($highlight[$authorization->getPHID()])) {
|
||||
$rowc[] = 'highlighted';
|
||||
} else {
|
||||
$rowc[] = '';
|
||||
}
|
||||
}
|
||||
|
||||
$panel = $this->buildClientAuthorizationList($rows, $rowc, $title);
|
||||
|
||||
return $this->buildStandardPageResponse(
|
||||
array(
|
||||
$this->getNoticeView(),
|
||||
$panel->appendChild($pager),
|
||||
),
|
||||
array('title' => $title));
|
||||
}
|
||||
|
||||
private function buildClientAuthorizationList($rows, $rowc, $title) {
|
||||
$table = new AphrontTableView($rows);
|
||||
$table->setRowClasses($rowc);
|
||||
$table->setHeaders(
|
||||
array(
|
||||
'Client',
|
||||
'Scope',
|
||||
'Created',
|
||||
'Updated',
|
||||
'',
|
||||
));
|
||||
$table->setColumnClasses(
|
||||
array(
|
||||
'wide pri',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'action',
|
||||
));
|
||||
if (empty($rows)) {
|
||||
$table->setNoDataString(
|
||||
'You have not authorized any clients for this OAuthServer.');
|
||||
}
|
||||
|
||||
$panel = new AphrontPanelView();
|
||||
$panel->appendChild($table);
|
||||
$panel->setHeader($title);
|
||||
|
||||
return $panel;
|
||||
}
|
||||
|
||||
private function getNoticeView() {
|
||||
$edited = $this->getRequest()->getStr('edited');
|
||||
$deleted = $this->getRequest()->getBool('deleted');
|
||||
if ($edited) {
|
||||
$title = 'Successfully edited client authorization.';
|
||||
} else if ($deleted) {
|
||||
$title = 'Successfully deleted client authorization.';
|
||||
} else {
|
||||
$title = null;
|
||||
}
|
||||
|
||||
if ($title) {
|
||||
$view = new AphrontErrorView();
|
||||
$view->setTitle($title);
|
||||
$view->setSeverity(AphrontErrorView::SEVERITY_NOTICE);
|
||||
} else {
|
||||
$view = null;
|
||||
}
|
||||
|
||||
return $view;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user