+
+ /**
+ * Data definitions
+ *
+ * Assure that our data objects are available in the DB
+ *
+ * @return boolean hook value
+ */
+ function onCheckSchema()
+ {
+ $schema = Schema::get();
+ $schema->ensureTable('user_openid',
+ array(new ColumnDef('canonical', 'varchar',
+ '255', false, 'PRI'),
+ new ColumnDef('display', 'varchar',
+ '255', false, 'UNI'),
+ new ColumnDef('user_id', 'integer',
+ null, false, 'MUL'),
+ new ColumnDef('created', 'datetime',
+ null, false),
+ new ColumnDef('modified', 'timestamp')));
+ $schema->ensureTable('user_openid_trustroot',
+ array(new ColumnDef('trustroot', 'varchar',
+ '255', false, 'PRI'),
+ new ColumnDef('user_id', 'integer',
+ null, false, 'PRI'),
+ new ColumnDef('created', 'datetime',
+ null, false),
+ new ColumnDef('modified', 'timestamp')));
+ return true;
+ }
+
+ /**
+ * Add our tables to be deleted when a user is deleted
+ *
+ * @param User $user User being deleted
+ * @param array &$tables Array of table names
+ *
+ * @return boolean hook value
+ */
+ function onUserDeleteRelated($user, &$tables)
+ {
+ $tables[] = 'User_openid';
+ $tables[] = 'User_openid_trustroot';
+ return true;
+ }
+
+ /**
+ * Add an OpenID tab to the admin panel
+ *
+ * @param Widget $nav Admin panel nav
+ *
+ * @return boolean hook value
+ */
+ function onEndAdminPanelNav($nav)
+ {
+ if (AdminPanelAction::canAdmin('openid')) {
+
+ $action_name = $nav->action->trimmed('action');
+
+ $nav->out->menuItem(
+ common_local_url('openidadminpanel'),
+ // 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'
+ );
+ }
+
+ 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
+ *
+ * @param array &$versions Array of version-data arrays
+ *
+ * @return boolean hook value
+ */
+ function onPluginVersion(&$versions)
+ {
+ $versions[] = array('name' => 'OpenID',
+ 'version' => STATUSNET_VERSION,
+ 'author' => 'Evan Prodromou, Craig Andrews',
+ 'homepage' => 'http://status.net/wiki/Plugin:OpenID',
+ 'rawdescription' =>
+ // TRANS: OpenID plugin description.
+ _m('Use <a href="http://openid.net/">OpenID</a> 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;
+ }