X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOpenID%2Fopenid.php;h=12c0ae7f31ab324ab23eb75633a2a979b0493a09;hb=e868ebfe77d6a83d3d94add10445a8946480c81f;hp=1524389177eb5ee0e6eb158655539927ec30b343;hpb=9c63ae6e443e7b23f64e31617a1762393473509a;p=quix0rs-gnu-social.git diff --git a/plugins/OpenID/openid.php b/plugins/OpenID/openid.php index 1524389177..12c0ae7f31 100644 --- a/plugins/OpenID/openid.php +++ b/plugins/OpenID/openid.php @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -require_once(INSTALLDIR.'/plugins/OpenID/User_openid.php'); +if (!defined('STATUSNET')) { + exit(1); +} require_once('Auth/OpenID.php'); require_once('Auth/OpenID/Consumer.php'); @@ -27,7 +27,7 @@ require_once('Auth/OpenID/Server.php'); require_once('Auth/OpenID/SReg.php'); require_once('Auth/OpenID/MySQLStore.php'); -# About one year cookie expiry +// About one year cookie expiry define('OPENID_COOKIE_EXPIRY', round(365.25 * 24 * 60 * 60)); define('OPENID_COOKIE_KEY', 'lastusedopenid'); @@ -36,7 +36,7 @@ function oid_store() { static $store = null; if (!$store) { - # Can't be called statically + // Can't be called statically $user = new User(); $conn = $user->getDatabaseConnection(); $store = new Auth_OpenID_MySQLStore($conn); @@ -85,12 +85,11 @@ function oid_get_last() function oid_link_user($id, $canonical, $display) { - $oid = new User_openid(); $oid->user_id = $id; $oid->canonical = $canonical; $oid->display = $display; - $oid->created = DB_DataObject_Cast::dateTime(); + $oid->created = common_sql_now(); if (!$oid->insert()) { $err = PEAR::getStaticProperty('DB_DataObject','lastError'); @@ -103,9 +102,9 @@ function oid_link_user($id, $canonical, $display) function oid_get_user($openid_url) { $user = null; - $oid = User_openid::staticGet('canonical', $openid_url); + $oid = User_openid::getKV('canonical', $openid_url); if ($oid) { - $user = User::staticGet('id', $oid->user_id); + $user = User::getKV('id', $oid->user_id); } return $user; } @@ -134,6 +133,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) $consumer = oid_consumer(); if (!$consumer) { + // TRANS: OpenID plugin server error. common_server_error(_m('Cannot instantiate OpenID consumer object.')); return false; } @@ -144,9 +144,14 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) // Handle failure status return values. if (!$auth_request) { + common_log(LOG_ERR, __METHOD__ . ": mystery fail contacting $openid_url"); + // TRANS: OpenID plugin message. Given when an OpenID is not valid. return _m('Not a valid OpenID.'); } else if (Auth_OpenID::isFailure($auth_request)) { - return sprintf(_m('OpenID failure: %s'), $auth_request->message); + common_log(LOG_ERR, __METHOD__ . ": OpenID fail to $openid_url: $auth_request->message"); + // TRANS: OpenID plugin server error. Given when the OpenID authentication request fails. + // TRANS: %s is the failure message. + return sprintf(_m('OpenID failure: %s.'), $auth_request->message); } $sreg_request = Auth_OpenID_SRegRequest::build(// Required @@ -164,33 +169,59 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) $auth_request->addExtension($sreg_request); } + $requiredTeam = common_config('openid', 'required_team'); + if ($requiredTeam) { + // LaunchPad OpenID extension + $team_request = new Auth_OpenID_TeamsRequest(array($requiredTeam)); + if ($team_request) { + $auth_request->addExtension($team_request); + } + } + $trust_root = common_root_url(true); $process_url = common_local_url($returnto); - if ($auth_request->shouldSendRedirect()) { + // Net::OpenID::Server as used on LiveJournal appears to incorrectly + // reject POST requests for data submissions that OpenID 1.1 specs + // as GET, although 2.0 allows them: + // https://rt.cpan.org/Public/Bug/Display.html?id=42202 + // + // Our OpenID libraries would have switched in the redirect automatically + // if it were detecting 1.1 compatibility mode, however the server is + // advertising itself as 2.0-compatible, so we got switched to the POST. + // + // Since the GET should always work anyway, we'll just take out the + // autosubmitter for now. + // + //if ($auth_request->shouldSendRedirect()) { $redirect_url = $auth_request->redirectURL($trust_root, $process_url, $immediate); if (!$redirect_url) { } else if (Auth_OpenID::isFailure($redirect_url)) { - return sprintf(_m('Could not redirect to server: %s'), $redirect_url->message); + // TRANS: OpenID plugin server error. Given when the OpenID authentication request cannot be redirected. + // TRANS: %s is the failure message. + return sprintf(_m('Could not redirect to server: %s.'), $redirect_url->message); } else { common_redirect($redirect_url, 303); } + /* } else { // Generate form markup and render it. $form_id = 'openid_message'; $form_html = $auth_request->formMarkup($trust_root, $process_url, $immediate, array('id' => $form_id)); - # XXX: This is cheap, but things choke if we don't escape ampersands - # in the HTML attributes + // XXX: This is cheap, but things choke if we don't escape ampersands + // in the HTML attributes $form_html = preg_replace('/&/', '&', $form_html); // Display an error if the form markup couldn't be generated; // otherwise, render the HTML. if (Auth_OpenID::isFailure($form_html)) { + // TRANS: OpenID plugin server error if the form markup could not be generated. + // TRANS: %s is the failure message. common_server_error(sprintf(_m('Could not create OpenID form: %s'), $form_html->message)); } else { $action = new AutosubmitAction(); // see below @@ -200,23 +231,28 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) $action->handle(array('action' => 'autosubmit')); } } + */ } -# Half-assed attempt at a module-private function +// Half-assed attempt at a module-private function function _oid_print_instructions() { common_element('div', 'instructions', + // TRANS: OpenID plugin user instructions. _m('This form should automatically submit itself. '. 'If not, click the submit button to go to your '. 'OpenID provider.')); } -# update a user from sreg parameters - -function oid_update_user(&$user, &$sreg) +/** + * Update a user from sreg parameters + * @param User $user + * @param array $sreg fields from OpenID sreg response + * @access private + */ +function oid_update_user($user, $sreg) { - $profile = $user->getProfile(); $orig_profile = clone($profile); @@ -227,18 +263,19 @@ function oid_update_user(&$user, &$sreg) if (!empty($sreg['country'])) { if ($sreg['postcode']) { - # XXX: use postcode to get city and region - # XXX: also, store postcode somewhere -- it's valuable! + // XXX: use postcode to get city and region + // XXX: also, store postcode somewhere -- it's valuable! $profile->location = $sreg['postcode'] . ', ' . $sreg['country']; } else { $profile->location = $sreg['country']; } } - # XXX save language if it's passed - # XXX save timezone if it's passed + // XXX save language if it's passed + // XXX save timezone if it's passed if (!$profile->update($orig_profile)) { + // TRANS: OpenID plugin server error. common_server_error(_m('Error saving the profile.')); return false; } @@ -250,6 +287,7 @@ function oid_update_user(&$user, &$sreg) } if (!$user->update($orig_user)) { + // TRANS: OpenID plugin server error. common_server_error(_m('Error saving the user.')); return false; } @@ -279,13 +317,41 @@ function oid_assert_allowed($url) return; } } - throw new ClientException(_m("Unauthorized URL used for OpenID login."), 403); + // TRANS: OpenID plugin client exception (403). + throw new ClientException(_m('Unauthorized URL used for OpenID login.'), 403); } } return; } +/** + * Check the teams available in the given OpenID response + * Using Launchpad's OpenID teams extension + * + * @return boolean whether this user is acceptable + */ +function oid_check_teams($response) +{ + $requiredTeam = common_config('openid', 'required_team'); + if ($requiredTeam) { + $team_resp = new Auth_OpenID_TeamsResponse($response); + if ($team_resp) { + $teams = $team_resp->getTeams(); + } else { + $teams = array(); + } + + $match = in_array($requiredTeam, $teams); + $is = $match ? 'is' : 'is not'; + common_log(LOG_DEBUG, "Remote user $is in required team $requiredTeam: [" . implode(', ', $teams) . "]"); + + return $match; + } + + return true; +} + class AutosubmitAction extends Action { var $form_html = null; @@ -299,11 +365,24 @@ class AutosubmitAction extends Action function title() { - return _m('OpenID Auto-Submit'); + // TRANS: Title + return _m('OpenID Login Submission'); } function showContent() { + $this->raw('

'); + // @todo FIXME: This would be better using standard CSS class, but the present theme's a bit scary. + $this->element('img', array('src' => Theme::path('images/icons/icon_processing.gif', 'base'), + // for some reason the base CSS sets s as block display?! + 'style' => 'display: inline')); + // TRANS: OpenID plugin message used while requesting authorization user's OpenID login provider. + $this->text(_m('Requesting authorization from your login provider...')); + $this->raw('

'); + $this->raw('

'); + // TRANS: OpenID plugin message. User instruction while requesting authorization user's OpenID login provider. + $this->text(_m('If you are not redirected to your login provider in a few seconds, try pushing the button below.')); + $this->raw('

'); $this->raw($this->form_html); } @@ -311,8 +390,6 @@ class AutosubmitAction extends Action { parent::showScripts(); $this->element('script', null, - '$(document).ready(function() { ' . - ' $(\'#'. $this->form_id .'\').submit(); '. - '});'); + 'document.getElementById(\'' . $this->form_id . '\').submit();'); } }