X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOpenID%2FOpenIDPlugin.php;h=2635cb7c9d09211d7b7c2bc26bf60526f586fde1;hb=c0bb1a57984266024e8e5a968c0f3a3b54befff6;hp=9eac9f6fcd2b5ddace8100181e8f67cb0fbf0724;hpb=ef51cc9ad4a37d6dcd2129828284def1c90d7402;p=quix0rs-gnu-social.git diff --git a/plugins/OpenID/OpenIDPlugin.php b/plugins/OpenID/OpenIDPlugin.php index 9eac9f6fcd..2635cb7c9d 100644 --- a/plugins/OpenID/OpenIDPlugin.php +++ b/plugins/OpenID/OpenIDPlugin.php @@ -20,7 +20,9 @@ * @category Plugin * @package StatusNet * @author Evan Prodromou + * @author Craig Andrews * @copyright 2009-2010 StatusNet, Inc. + * @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/ */ @@ -38,11 +40,12 @@ if (!defined('STATUSNET')) { * @category Plugin * @package StatusNet * @author Evan Prodromou + * @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/ * @link http://openid.net/ */ - class OpenIDPlugin extends Plugin { // Plugin parameter: set true to disallow non-OpenID logins @@ -56,7 +59,6 @@ class OpenIDPlugin extends Plugin global $config; $config['site']['openidonly'] = (bool)$this->openidOnly; } - } /** @@ -68,7 +70,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onStartInitializeRouter($m) { $m->connect('main/openid', array('action' => 'openidlogin')); @@ -94,13 +95,17 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onStartConnectPath(&$path, &$defaults, &$rules, &$result) { if (common_config('site', 'openidonly')) { - static $block = array('main/login', - 'main/register', - 'main/recoverpassword', + // Note that we should not remove the login and register + // actions. Lots of auth-related things link to them, + // such as when visiting a private site without a session + // or revalidating a remembered login for admin work. + // + // We take those two over with redirects to ourselves + // over in onArgsInitialize(). + static $block = array('main/recoverpassword', 'settings/password'); if (in_array($path, $block)) { @@ -118,7 +123,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onArgsInitialize($args) { if (common_config('site', 'openidonly')) { @@ -149,7 +153,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onEndPublicXRDS($action, &$xrdsOutputter) { $xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', @@ -180,7 +183,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onEndUserXRDS($action, &$xrdsOutputter) { $xrdsOutputter->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', @@ -209,22 +211,21 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onStartPrimaryNav($action) { if (common_config('site', 'openidonly') && !common_logged_in()) { // TRANS: Tooltip for main menu option "Login" $tooltip = _m('TOOLTIP', 'Login to the site'); - // TRANS: Main menu option when not logged in to log in $action->menuItem(common_local_url('openidlogin'), + // TRANS: Main menu option when not logged in to log in _m('MENU', 'Login'), $tooltip, false, 'nav_login'); // TRANS: Tooltip for main menu option "Help" $tooltip = _m('TOOLTIP', 'Help me!'); - // TRANS: Main menu option for help on the StatusNet site $action->menuItem(common_local_url('doc', array('title' => 'help')), + // TRANS: Main menu option for help on the StatusNet site _m('MENU', 'Help'), $tooltip, false, @@ -232,8 +233,8 @@ class OpenIDPlugin extends Plugin if (!common_config('site', 'private')) { // TRANS: Tooltip for main menu option "Search" $tooltip = _m('TOOLTIP', 'Search for people or text'); - // TRANS: Main menu option when logged in or when the StatusNet instance is not private $action->menuItem(common_local_url('peoplesearch'), + // TRANS: Main menu option when logged in or when the StatusNet instance is not private _m('MENU', 'Search'), $tooltip, false, 'nav_search'); } Event::handle('EndPrimaryNav', array($action)); @@ -247,12 +248,11 @@ class OpenIDPlugin extends Plugin * * If we're in openidOnly mode, we disable the menu for all other login. * - * @param Action &$action Action being executed + * @param Action $action Action being executed * * @return boolean hook return */ - - function onStartLoginGroupNav(&$action) + function onStartLoginGroupNav($action) { if (common_config('site', 'openidonly')) { $this->showOpenIDLoginTab($action); @@ -268,12 +268,11 @@ class OpenIDPlugin extends Plugin /** * Menu item for login * - * @param Action &$action Action being executed + * @param Action $action Action being executed * * @return boolean hook return */ - - function onEndLoginGroupNav(&$action) + function onEndLoginGroupNav($action) { $this->showOpenIDLoginTab($action); @@ -287,13 +286,14 @@ class OpenIDPlugin extends Plugin * * @return void */ - function showOpenIDLoginTab($action) { $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('openidlogin'), - _m('OpenID'), + // TRANS: OpenID plugin menu item on site logon page. + _m('MENU', 'OpenID'), + // TRANS: OpenID plugin tooltip for logon menu item. _m('Login or register with OpenID'), $action_name === 'openidlogin'); } @@ -308,7 +308,6 @@ class OpenIDPlugin extends Plugin * * @return void */ - function onStartAccountSettingsPasswordMenuItem($menu, &$unused) { if (common_config('site', 'openidonly')) { return false; @@ -319,17 +318,18 @@ class OpenIDPlugin extends Plugin /** * Menu item for OpenID settings * - * @param Action &$action Action being executed + * @param Action $action Action being executed * * @return boolean hook return */ - - function onEndAccountSettingsNav(&$action) + function onEndAccountSettingsNav($action) { $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('openidsettings'), - _m('OpenID'), + // TRANS: OpenID plugin menu item on user settings page. + _m('MENU', 'OpenID'), + // TRANS: OpenID plugin tooltip for user settings menu item. _m('Add or remove OpenIDs'), $action_name === 'openidsettings'); @@ -345,7 +345,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onAutoload($cls) { switch ($cls) @@ -387,7 +386,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onSensitiveAction($action, &$ssl) { switch ($action) @@ -411,7 +409,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook return */ - function onLoginAction($action, &$login) { switch ($action) @@ -434,7 +431,6 @@ class OpenIDPlugin extends Plugin * * @return void */ - function onEndShowHeadElements($action) { if ($action instanceof ShowstreamAction) { @@ -458,7 +454,6 @@ class OpenIDPlugin extends Plugin * * @return boolean whether to continue */ - function onRedirectToLogin($action, $user) { if (common_config('site', 'openid_only') || (!empty($user) && User_openid::hasOpenID($user->id))) { @@ -475,7 +470,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onEndShowPageNotice($action) { $name = $action->trimmed('action'); @@ -514,7 +508,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onStartLoadDoc(&$title, &$output) { if ($title == 'openid') { @@ -536,7 +529,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onEndLoadDoc($title, &$output) { if ($title == 'help') { @@ -555,7 +547,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onCheckSchema() { $schema = Schema::get(); @@ -588,7 +579,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onUserDeleteRelated($user, &$tables) { $tables[] = 'User_openid'; @@ -603,7 +593,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onEndAdminPanelNav($nav) { if (AdminPanelAction::canAdmin('openid')) { @@ -612,7 +601,9 @@ class OpenIDPlugin extends Plugin $nav->out->menuItem( common_local_url('openidadminpanel'), - _m('OpenID'), + // TRANS: OpenID configuration menu item. + _m('MENU','OpenID'), + // TRANS: Tooltip for OpenID configuration menu item. _m('OpenID configuration'), $action_name == 'openidadminpanel', 'nav_openid_admin_panel' @@ -629,7 +620,6 @@ class OpenIDPlugin extends Plugin * * @return boolean hook value */ - function onPluginVersion(&$versions) { $versions[] = array('name' => 'OpenID', @@ -637,7 +627,137 @@ class OpenIDPlugin extends Plugin 'author' => 'Evan Prodromou, Craig Andrews', 'homepage' => 'http://status.net/wiki/Plugin:OpenID', 'rawdescription' => + // TRANS: OpenID plugin description. _m('Use OpenID to login to the site.')); return true; } + + function onStartOAuthLoginForm($action, &$button) + { + if (common_config('site', 'openidonly')) { + // Cancel the regular password login form, we won't need it. + $this->showOAuthLoginForm($action); + // TRANS: button label for OAuth authorization page when needing OpenID authentication first. + $button = _m('BUTTON', 'Continue'); + return false; + } else { + // Leave the regular password login form in place. + // We'll add an OpenID link at bottom...? + return true; + } + } + + /** + * @fixme merge with common code for main OpenID login form + * @param HTMLOutputter $action + */ + protected function showOAuthLoginForm($action) + { + $action->elementStart('fieldset'); + // TRANS: OpenID plugin logon form legend. + $action->element('legend', null, _m('OpenID login')); + + $action->elementStart('ul', 'form_data'); + $action->elementStart('li'); + $provider = common_config('openid', 'trusted_provider'); + $appendUsername = common_config('openid', 'append_username'); + if ($provider) { + // TRANS: Field label. + $action->element('label', array(), _m('OpenID provider')); + $action->element('span', array(), $provider); + if ($appendUsername) { + $action->element('input', array('id' => 'openid_username', + 'name' => 'openid_username', + 'style' => 'float: none')); + } + $action->element('p', 'form_guide', + // TRANS: Form guide. + ($appendUsername ? _m('Enter your username.') . ' ' : '') . + // TRANS: Form guide. + _m('You will be sent to the provider\'s site for authentication.')); + $action->hidden('openid_url', $provider); + } else { + // TRANS: OpenID plugin logon form field label. + $action->input('openid_url', _m('OpenID URL'), + '', + // TRANS: OpenID plugin logon form field instructions. + _m('Your OpenID URL')); + } + $action->elementEnd('li'); + $action->elementEnd('ul'); + + $action->elementEnd('fieldset'); + } + + /** + * Handle a POST user credential check in apioauthauthorization. + * If given an OpenID URL, we'll pass us over to the regular things + * and then redirect back here on completion. + * + * @fixme merge with common code for main OpenID login form + * @param HTMLOutputter $action + */ + function onStartOAuthLoginCheck($action, &$user) + { + $provider = common_config('openid', 'trusted_provider'); + if ($provider) { + $openid_url = $provider; + if (common_config('openid', 'append_username')) { + $openid_url .= $action->trimmed('openid_username'); + } + } else { + $openid_url = $action->trimmed('openid_url'); + } + + if ($openid_url) { + require_once dirname(__FILE__) . '/openid.php'; + oid_assert_allowed($openid_url); + + $returnto = common_local_url( + 'ApiOauthAuthorize', + array(), + array( + 'oauth_token' => $action->arg('oauth_token'), + 'mode' => $action->arg('mode') + ) + ); + common_set_returnto($returnto); + + // This will redirect if functional... + $result = oid_authenticate($openid_url, + 'finishopenidlogin'); + if (is_string($result)) { # error message + throw new ServerException($result); + } else { + exit(0); + } + } + + return true; + } + + /** + * Add link in user's XRD file to allow OpenID login. + * + * This link in the XRD should let users log in with their + * Webfinger identity to services that support it. See + * http://webfinger.org/login for an example. + * + * @param XRD &$xrd Currently-displaying XRD object + * @param User $user The user that it's for + * + * @return boolean hook value (always true) + */ + + function onEndXrdActionLinks(&$xrd, $user) + { + $profile = $user->getProfile(); + + if (!empty($profile)) { + $xrd->links[] = array('rel' => 'http://specs.openid.net/auth/2.0/provider', + 'href' => $profile->profileurl); + } + + return true; + } }