From 6f95ccd37de1f7e2063206e87c93cbe06097eae7 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sun, 5 Sep 2010 18:03:31 -0400 Subject: [PATCH] Create Account Manager plugin implementing the Account Management specification Add Account Manager support to the OpenID plugin --- ...AccountManagementControlDocumentAction.php | 98 +++++++++++++++ .../AccountManagementSessionStatusAction.php | 73 +++++++++++ .../AccountManager/AccountManagerPlugin.php | 115 ++++++++++++++++++ plugins/AccountManager/README | 16 +++ plugins/OpenID/OpenIDPlugin.php | 22 ++++ 5 files changed, 324 insertions(+) create mode 100644 plugins/AccountManager/AccountManagementControlDocumentAction.php create mode 100644 plugins/AccountManager/AccountManagementSessionStatusAction.php create mode 100644 plugins/AccountManager/AccountManagerPlugin.php create mode 100644 plugins/AccountManager/README diff --git a/plugins/AccountManager/AccountManagementControlDocumentAction.php b/plugins/AccountManager/AccountManagementControlDocumentAction.php new file mode 100644 index 0000000000..3fcea5af42 --- /dev/null +++ b/plugins/AccountManager/AccountManagementControlDocumentAction.php @@ -0,0 +1,98 @@ +. + * + * @category AccountManager + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Implements the JSON Account Management endpoint + * + * @category AccountManager + * @package StatusNet + * @author ECraig Andrews + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class AccountManagementControlDocumentAction extends Action +{ + /** + * handle the action + * + * @param array $args unused. + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + header('Content-Type: application/json; charset=utf-8'); + + $amcd = array(); + + if(Event::handle('StartAccountManagementControlDocument', array(&$amcd))) { + + $amcd['version'] = 1; + $amcd['sessionstatus'] = array( + 'method' => 'GET', + 'path' => common_local_url('AccountManagementSessionStatus') + ); + $amcd['auth-methods'] = array( + 'username-password-form' => array( + 'connect' => array( + 'method' => 'POST', + 'path' => common_local_url('login'), + 'params' => array( + 'username' => 'nickname', + 'password' => 'password' + ) + ), + 'disconnect' => array( + 'method' => 'GET', + 'path' => common_local_url('logout') + ) + ) + ); + + Event::handle('EndAccountManagementControlDocument', array(&$amcd)); + } + + print json_encode($amcd); + + return true; + } + + function isReadOnly() + { + return true; + } +} diff --git a/plugins/AccountManager/AccountManagementSessionStatusAction.php b/plugins/AccountManager/AccountManagementSessionStatusAction.php new file mode 100644 index 0000000000..48b6034ff6 --- /dev/null +++ b/plugins/AccountManager/AccountManagementSessionStatusAction.php @@ -0,0 +1,73 @@ +. + * + * @category AccountManager + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Implements the session status Account Management endpoint + * + * @category AccountManager + * @package StatusNet + * @author ECraig Andrews + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class AccountManagementSessionStatusAction extends Action +{ + /** + * handle the action + * + * @param array $args unused. + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + $cur = common_current_user(); + if(empty($cur)) { + print 'none'; + } else { + //TODO it seems " should be escaped in the name and id, but the spec doesn't seem to indicate how to do that + print 'active; name="' . $cur->nickname . '"; id="' . $cur->nickname . '"'; + } + + return true; + } + + function isReadOnly() + { + return true; + } +} diff --git a/plugins/AccountManager/AccountManagerPlugin.php b/plugins/AccountManager/AccountManagerPlugin.php new file mode 100644 index 0000000000..52dd64a24b --- /dev/null +++ b/plugins/AccountManager/AccountManagerPlugin.php @@ -0,0 +1,115 @@ +. + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class AccountManagerPlugin extends Plugin +{ + + const AM_REL = 'acct-mgmt'; + + function __construct() + { + parent::__construct(); + } + + function onAutoload($cls) + { + switch ($cls) + { + case 'AccountManagementControlDocumentAction': + require_once(INSTALLDIR.'/plugins/AccountManager/AccountManagementControlDocumentAction.php'); + return false; + case 'AccountManagementSessionStatusAction': + require_once(INSTALLDIR.'/plugins/AccountManager/AccountManagementSessionStatusAction.php'); + return false; + } + } + + /** + * Hook for RouterInitialized event. + * + * @param Net_URL_Mapper $m path-to-action mapper + * @return boolean hook return + */ + function onRouterInitialized($m) + { + // Discovery actions + $m->connect('main/amcd.json', + array('action' => 'AccountManagementControlDocument')); + $m->connect('main/amsessionstatus', + array('action' => 'AccountManagementSessionStatus')); + return true; + } + + function onStartHostMetaLinks(&$links) { + $links[] = array('rel' => AccountManagerPlugin::AM_REL, + 'href' => common_local_url('AccountManagementControlDocument')); + } + + function onStartShowHTML($action) + { + //Account management discovery link + header('Link: <'.common_local_url('AccountManagementControlDocument').'>; rel="'. AccountManagerPlugin::AM_REL.'"; type="application/json"'); + + //Account management login status + $cur = common_current_user(); + if(empty($cur)) { + header('X-Account-Management-Status: none'); + } else { + //TODO it seems " should be escaped in the name and id, but the spec doesn't seem to indicate how to do that + header('X-Account-Management-Status: active; name="' . $cur->nickname . '"; id="' . $cur->nickname . '"'); + } + } + + function onLoginAction($action, &$login) { + switch ($action) + { + case 'AccountManagementControlDocument': + $login = true; + return false; + default: + return true; + } + + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'AccountManager', + 'version' => STATUSNET_VERSION, + 'author' => 'Craig Andrews', + 'homepage' => 'http://status.net/wiki/Plugin:AccountManager', + 'rawdescription' => + _m('The Account Manager plugin implements the Account Manager specification.')); + return true; + } +} diff --git a/plugins/AccountManager/README b/plugins/AccountManager/README new file mode 100644 index 0000000000..a0715927b3 --- /dev/null +++ b/plugins/AccountManager/README @@ -0,0 +1,16 @@ +The Account Manager plugin implements the Account Manager specification to "allow a server to describe an account-based user identification process in terms that a user-agent can understand." + +See https://wiki.mozilla.org/Labs/Weave/Identity/Account_Manager/Spec/Latest + +Installation +============ +add "addPlugin('accountManager');" +to the bottom of your config.php + +Settings +======== +none + +Example +======= +addPlugin('accountManager'); diff --git a/plugins/OpenID/OpenIDPlugin.php b/plugins/OpenID/OpenIDPlugin.php index 7d6a5dc000..e58440fc10 100644 --- a/plugins/OpenID/OpenIDPlugin.php +++ b/plugins/OpenID/OpenIDPlugin.php @@ -630,6 +630,28 @@ class OpenIDPlugin extends Plugin return true; } + /** + * Add OpenID information to the Account Management Control Document + * Event supplied by the Account Manager plugin + * + * @param array &$amcd Array that expresses the AMCD + * + * @return boolean hook value + */ + + function onEndAccountManagementControlDocument(&$amcd) + { + $amcd['auth-methods']['openid'] = array( + 'connect' => array( + 'method' => 'POST', + 'path' => common_local_url('openidlogin'), + 'params' => array( + 'identity' => 'openid_url' + ) + ) + ); + } + /** * Add our version information to output *