diff options
Diffstat (limited to 'mod/openid_client')
19 files changed, 905 insertions, 0 deletions
diff --git a/mod/openid_client/actions/openid_client/login.php b/mod/openid_client/actions/openid_client/login.php new file mode 100644 index 000000000..2a6896a61 --- /dev/null +++ b/mod/openid_client/actions/openid_client/login.php @@ -0,0 +1,32 @@ +<?php +/** + * OpenID client login action + */ + +elgg_load_library('openid_consumer'); + +$provider = get_input('openid_provider'); +$persistent = get_input('persistent', false); + +if ($provider == 'others') { +	$provider = get_input('openid_url'); +} + +$consumer = new ElggOpenIDConsumer($store); +$consumer->setURL($provider); +$consumer->setReturnURL(elgg_get_site_url() . "mod/openid_client/return.php?persistent=$persistent"); + +$html = $consumer->requestAuthentication(); +if ($html) { +	echo $html; +	exit; +} else { +	$flipped_providers = array_flip(elgg_get_config('openid_providers')); +	if (isset($flipped_providers[$provider])) { +		$provider_name = $flipped_providers[$provider]; +	} else { +		$provider_name = $provider; +	} +	register_error(elgg_echo('openid_client:error:no_html', array($provider_name))); +	forward(); +} diff --git a/mod/openid_client/actions/openid_client/register.php b/mod/openid_client/actions/openid_client/register.php new file mode 100644 index 000000000..f0ad2a5fd --- /dev/null +++ b/mod/openid_client/actions/openid_client/register.php @@ -0,0 +1,35 @@ +<?php +/** + * Register OpenID user action + */ + +elgg_set_context('openid_client'); + +$username = get_input('username'); +$name = get_input('name'); +$email = get_input('email'); +$openid_identifier = get_input('openid_identifier'); + +$password = generate_random_cleartext_password(); + +try { +	$guid = register_user($username, $password, $name, $email, false); +} catch (RegistrationException $e) { +	register_error($e->getMessage()); +	forward(REFERER); +} +$user = get_entity($guid); +openid_client_set_subtype($user); + +$user->annotate('openid_identifier', $openid_identifier, ACCESS_PUBLIC); +elgg_set_user_validation_status($guid, true, 'openid'); + +if (!elgg_trigger_plugin_hook('register', 'user', array('user' => $user), true)) { +	$user->delete(); +	register_error(elgg_echo('registerbad')); +	forward(REFERER); +} + +login($user); +system_message(elgg_echo('openid_client:success:register')); +forward(); diff --git a/mod/openid_client/classes/ElggOpenIDConsumer.php b/mod/openid_client/classes/ElggOpenIDConsumer.php new file mode 100644 index 000000000..098201343 --- /dev/null +++ b/mod/openid_client/classes/ElggOpenIDConsumer.php @@ -0,0 +1,238 @@ +<?php +/** + * Consumer for OpenID + */ + +class ElggOpenIDConsumer { + +	protected $openIdUrl; +	protected $returnURL; + +	protected $store; +	protected $consumer; +	protected $request; + +	/** +	 * Constructor +	 * +	 * @param Auth_OpenID_OpenIDStore $store Optional persistence store +	 */ +	public function __construct(Auth_OpenID_OpenIDStore $store = null) { +		if ($store) { +			$this->store = $store; +		} else { +			// use the default store +			$this->store = new OpenID_ElggStore(); +		} +	} + +	/** +	 * Set the OpenID username +	 * +	 * @param string $username +	 */ +	public function setURL($url) { +		$this->openIdUrl = $url; +	} + +	/** +	 * Set the return URL +	 * +	 * @param string $url The URL the OpenID provider returns the user to +	 */ +	public function setReturnURL($url) { +		$this->returnURL = $url; +	} + +	/** +	 * Send a request to the provider for authentication +	 * +	 * @return mixed HTMl form on success and false for failure +	 */ +	public function requestAuthentication() { + +		if (!$this->store) { +			return false; +		} + +		$this->consumer = new Auth_OpenID_Consumer($this->store); +		if (!$this->consumer) { +			return false; +		} + +		$url = $this->openIdUrl; +		if (!$url) { +			return false; +		} + +		// discovers the identity server +		$this->request = $this->consumer->begin($url); +		if (!$this->request) { +			return false; +		} + +		// request user information +		if (!$this->addAttributeRequests()) { +			return false; +		} + +		// send browser for authentication +		return $this->getForm(); +	} + +	/** +	 * Complete the OpenID authentication by parsing the response +	 * +	 * This returns an array of key value pairs about the user. +	 *  +	 * @return array +	 */ +	public function completeAuthentication() { + +		if (!$this->store) { +			return false; +		} + +		$this->consumer = new Auth_OpenID_Consumer($this->store); +		if (!$this->consumer) { +			return false; +		} + +		$response = $this->consumer->complete($this->returnURL); +		switch ($response->status) { +			case Auth_OpenID_SUCCESS: +				$data = $this->getUserData($response); +				break; +			case Auth_OpenID_FAILURE: +			case Auth_OpenID_CANCEL: +				$data = array(); +				break; +		} + +		return $data; +	} + +	/** +	 * Add attribute requests to the OpenID authentication request +	 *  +	 * @return bool +	 */ +	protected function addAttributeRequests() { + +		// Simple Registration +		$required = array(); +		$optional = array('email', 'nickname', 'fullname', 'language'); +		$sregRequest = Auth_OpenID_SRegRequest::build($required, $optional); +		if (!$sregRequest) { +			return false; +		} +		$this->request->addExtension($sregRequest); + +		// Attribute Exchange +		$axRequest = new Auth_OpenID_AX_FetchRequest(); +		$attributes[] = Auth_OpenID_AX_AttrInfo::make('http://axschema.org/contact/email', 1, true, 'email'); +		$attributes[] = Auth_OpenID_AX_AttrInfo::make('http://axschema.org/namePerson/first', 1, true, 'firstname'); +		$attributes[] = Auth_OpenID_AX_AttrInfo::make('http://axschema.org/namePerson/last', 1, true, 'lastname'); +		foreach ($attributes as $attribute) { +			$axRequest->add($attribute); +		} +		$this->request->addExtension($axRequest); + +		return true; +	} + +	/** +	 * Gets the form to send the user to the provider to authenticate +	 * +	 * This implements OpenID 2.0 by submitting a form through JavaScript against +	 * the provider. If JavaScript is not enabled, a plain html form with a +	 * continue button is displayed. +	 * +	 * This also supports OpenID 1.x but has not been tested as thoroughly. +	 * +	 * @return mixed +	 */ +	protected function getForm() { +		if (!$this->request->shouldSendRedirect()) { +			// OpenID 2.0 +			$html = $this->request->htmlMarkup(elgg_get_site_url(), $this->returnURL, false); +			return $html; +		} else { +			// OpenID 1.x +			$redirect_url = $this->request->redirectURL(elgg_get_site_url(), $this->returnURL); + +			if (Auth_OpenID::isFailure($redirect_url)) { +				return false; +			} else { +				forward($redirect_url); +			} +		} +	} + +	/** +	 * Get user data from the OpenID response +	 *  +	 * @param Auth_OpenID_ConsumerResponse $response +	 * @return array +	 */ +	protected function getUserData($response) { +		if (!$response) { +			return array(); +		} + +		$sregResponse = Auth_OpenID_SRegResponse::fromSuccessResponse($response); +		$sreg = $sregResponse->contents(); + +		$axResponse = Auth_OpenID_AX_FetchResponse::fromSuccessResponse($response); +		$ax = $axResponse->data; + +		$data = $this->extractUserData($sreg, $ax); +		$data['openid_identifier'] = $response->getDisplayIdentifier(); + +		return $data; +	} + +	/** +	 * Extract user data from the extensions in the response +	 * +	 * @param array $sreg Simple Registration data +	 * @param array $ax   Attribute Exchange data +	 * @return array +	 */ +	protected function extractUserData($sreg, $ax) { +		$data = array(); + +		// email +		if (isset($sreg['email'])) { +			$data['email'] = $sreg['email']; +		} +		if (isset($ax['http://axschema.org/contact/email'])) { +			$data['email'] = $ax['http://axschema.org/contact/email'][0]; +		} + +		// display name +		if (isset($sreg['fullname'])) { +			$data['name'] = $sreg['fullname']; +		} +		if (isset($ax['http://axschema.org/namePerson/first'])) { +			$data['name'] = $ax['http://axschema.org/namePerson/first'][0]; +		} +		if (isset($ax['http://axschema.org/namePerson/last'])) { +			$data['name'] .= ' ' . $ax['http://axschema.org/namePerson/last'][0]; +			$data['name'] = trim($data['name']); +		} + +		// username +		if (isset($sreg['nickname'])) { +			$data['username'] = $sreg['nickname']; +		} + +		// language +		if (isset($sreg['language'])) { +			$languages = get_installed_translations(); +			// @todo - find out format +		} + +		return $data; +	} +} diff --git a/mod/openid_client/graphics/openid_icon.png b/mod/openid_client/graphics/openid_icon.png Binary files differnew file mode 100644 index 000000000..97d4714c5 --- /dev/null +++ b/mod/openid_client/graphics/openid_icon.png diff --git a/mod/openid_client/languages/en.php b/mod/openid_client/languages/en.php new file mode 100644 index 000000000..4af3bf06a --- /dev/null +++ b/mod/openid_client/languages/en.php @@ -0,0 +1,28 @@ +<?php
 +/**
 + * OpenID client English language file
 + */
 +
 +$english = array(
 +
 +	'openid_client' => 'OpenID',
 +	'openid_client:login:header' => 'Log in with',
 +	'openid_client:login' => 'Login in with OpenID',
 +	'openid_client:others' => 'Others...',
 +	'openid_client:url' => 'OpenID URL',
 +
 +	'openid_client:create' => 'Create an account',
 +	'openid_client:create:instructs' => 'Your account has been approved. We just need you to confirm or set the below information.',
 +
 +	'openid_client:success:register' => 'Your account has been created.',
 +	'openid_client:error:bad_register' => 'Unable to create an account. Please contact a site administrator.',
 +	'openid_client:error:bad_response' => 'Bad response from the OpenID server',
 +	'openid_client:error:no_html' => 'An error occurred trying to contact %s',
 +	'openid_client:warning:username_not_available' => 'The username %s is not available. Please pick another.',
 +	'openid_client:warning:username_valid' => 'The username %s is not valid as this site. Please pick another.',
 +	'openid_client:warning:email_not_available' => 'The email address %s is not available. Please pick another.',
 +
 +	'river:friend:user:openid' => "%s is now a friend with %s",
 +);
 +
 +add_translation('en', $english);
 diff --git a/mod/openid_client/lib/helpers.php b/mod/openid_client/lib/helpers.php new file mode 100644 index 000000000..3fc101c42 --- /dev/null +++ b/mod/openid_client/lib/helpers.php @@ -0,0 +1,114 @@ +<?php +/** + * Helper functions for the OpenID client plugin + */ + +/** + * Serves a page to the new user to determine account values + * + * This should only be called after validating the OpenID response. + * + * @param array $data Key value pairs extracted from the response + * @return bool + */ +function openid_client_registration_page_handler(array $data) { + +	if (!is_array($data)) { +		return false; +	} + +	$title = elgg_echo('openid_client:create'); + +	$vars = openid_client_prepare_registration_vars($data); +	$content = elgg_view('openid_client/register', $vars); + +	$params = array( +		'title' => $title, +		'content' => $content, +	); +	$body = elgg_view_layout('one_column', $params); +	echo elgg_view_page($title, $body); + +	return true; +} + +/** + * Create the form vars for registration + * + * @param array $data + * @return array + */ +function openid_client_prepare_registration_vars(array $data) { +	$vars = array(); + +	$vars['openid_identifier'] = $data['openid_identifier']; + +	// username +	if (isset($data['username'])) { +		$vars['username'] = $data['username']; +	} else if (isset($data['email'])) { +		$vars['username'] = array_shift(explode('@', $data['email'])); +	} else { +		$vars['username'] = null; +	} + +	// is the username available +	if ($vars['username']) { +		$vars['is_username_available'] = openid_client_is_username_available($vars['username']); +	} + +	// is the username valid +	try { +		$vars['is_username_valid'] = validate_username($vars['username']); +	} catch (RegistrationException $e) { +		$vars['is_username_valid'] = false; +	} + +	// the rest +	$vars['email'] = elgg_extract('email', $data); +	$vars['name'] = elgg_extract('name', $data); + +	if ($vars['email']) { +		$vars['is_email_available'] = openid_client_is_email_available($vars['email']); +	} + +	return $vars; +} + +/** + * Is this username available? + * + * @param string $username The username + * @return bool  + */ +function openid_client_is_username_available($username) { +	$db_prefix = elgg_get_config('dbprefix'); +	$username = sanitize_string($username); + +	$query = "SELECT count(*) AS total FROM {$db_prefix}users_entity WHERE username = '$username'"; +	$result = get_data_row($query); +	if ($result->total == 0) { +		return true; +	} else { +		return false; +	} +} + +/** + * Is this email address available? + * + * @param string $email Email address + * @return bool + */ +function openid_client_is_email_available($email) { +	$db_prefix = elgg_get_config('dbprefix'); +	$email = sanitize_string($email); + +	$query = "SELECT count(*) AS total FROM {$db_prefix}users_entity WHERE email = '$email'"; +	$result = get_data_row($query); +	if ($result->total == 0) { +		return true; +	} else { +		return false; +	} +} diff --git a/mod/openid_client/manifest.xml b/mod/openid_client/manifest.xml new file mode 100644 index 000000000..eba4674c7 --- /dev/null +++ b/mod/openid_client/manifest.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8"> +	<name>OpenID Client</name> +	<author>Core developers</author> +	<version>1.8.0</version> +	<description>OpenID consumer for Elgg. Enabled users log in using their credentials from sites like Google and Yahoo.</description> +	<category>user</category> +	<website>http://www.elgg.org/</website> +	<copyright>Cash Costello 2011</copyright> +	<license>GNU General Public License version 2</license> +	<requires> +		<type>elgg_release</type> +		<version>1.8</version> +	</requires> +	<requires> +		<type>plugin</type> +		<name>openid_api</name> +	</requires> +</plugin_manifest> diff --git a/mod/openid_client/return.php b/mod/openid_client/return.php new file mode 100644 index 000000000..3aa728ea6 --- /dev/null +++ b/mod/openid_client/return.php @@ -0,0 +1,69 @@ +<?php
 +/**
 + * Callback for return_to url redirection.
 + * 
 + * The identity server will redirect back to this handler with the results of
 + * the authentication attempt.
 + * 
 + * Note: the Janrain OpenID library is incompatible with Elgg's routing so
 + * this script needs to be directly accessed.
 + */
 +
 +require_once dirname(dirname(dirname(__FILE__))).'/engine/start.php';
 +
 +elgg_load_library('openid_consumer');
 +elgg_load_library('openid_client');
 +
 +$persistent = get_input('persistent', false);
 +
 +// get user data from the response
 +$consumer = new ElggOpenIDConsumer($store);
 +$url = elgg_get_site_url() . "mod/openid_client/return.php?persistent=$persistent";
 +$consumer->setReturnURL($url);
 +$data = $consumer->completeAuthentication();
 +if (!$data || !$data['openid_identifier']) {
 +	register_error(elgg_echo('openid_client:error:bad_response'));
 +	forward();
 +}
 +
 +// is there an account already associated with this openid
 +$user = null;
 +$users = elgg_get_entities_from_annotations(array(
 +	'type' => 'user',
 +	'annotation_name' => 'openid_identifier',
 +	'annotation_value' => $data['openid_identifier'],
 +));
 +if ($users) {
 +	// there should only be one account
 +	$user = $users[0];
 +} else {
 +	$email = elgg_extract('email', $data);
 +	if ($email) {
 +		$users = get_user_by_email($email);
 +		if (count($users)) {
 +                       register_error(elgg_echo('openid_client:email_register'));
 +                       forward();
 +
 +		}
 +	}
 +}
 +
 +if ($user) {
 +	// log in user and maybe update account (admin setting, user prompt?)
 +	try {
 +		login($user, $persistent);
 +	} catch (LoginException $e) {
 +		register_error($e->getMessage());
 +		forward();
 +	}
 +
 +	system_message(elgg_echo('loginok'));
 +	forward();
 +} else {
 +	// register the new user
 +	$result = openid_client_registration_page_handler($data);
 +	if (!$result) {
 +		register_error(elgg_echo('openid_client:error:bad_register'));
 +		forward();
 +	}
 +}
 diff --git a/mod/openid_client/start.php b/mod/openid_client/start.php new file mode 100644 index 000000000..a21832230 --- /dev/null +++ b/mod/openid_client/start.php @@ -0,0 +1,78 @@ +<?php
 +/**
 + * Elgg OpenID client
 + *
 + * This is a rewrite of the OpenID client written by Kevin Jardine for
 + * Curverider Ltd for Elgg 1.0-1.7.
 + */
 +
 +elgg_register_event_handler('init', 'system', 'openid_client_init');
 +
 +/**
 + * OpenID client initialization
 + */
 +function openid_client_init() {
 +	elgg_extend_view('css/elgg', 'openid_client/css');
 +	elgg_extend_view('js/elgg', 'openid_client/js');
 +
 +	elgg_register_plugin_hook_handler('register', 'menu:openid_login', 'openid_client_setup_menu');
 +	
 +	$base = elgg_get_plugins_path() . 'openid_client/actions/openid_client';
 +	elgg_register_action('openid_client/login', "$base/login.php", 'public');
 +	elgg_register_action('openid_client/register', "$base/register.php", 'public');
 +
 +	$base = elgg_get_plugins_path() . 'openid_client/lib';
 +	elgg_register_library('openid_client', "$base/helpers.php");
 +	
 +	elgg_set_config('openid_providers', array(
 +		'N-1'			=> 'https://n-1.cc/mod/openid_server/server.php',
 +		'Ecoxarxes'		=> 'https://cooperativa.ecoxarxes.cat/mod/openid_server/server.php',
 +                'Anillosur'             => 'https://anillosur.net/mod/openid_server/server.php',
 +                'Saravea'               => 'https://saravea.net/mod/openid_server/server.php',
 +                'Enekenbat'             => 'https://enekenbat.cc/mod/openid_server/server.php',
 +		// ...
 +	));
 +
 +	// the return to page needs to be public
 +	elgg_register_plugin_hook_handler('public_pages', 'walled_garden', 'openid_client_public');
 +	elgg_register_event_handler('upgrade', 'system', 'openid_client_run_upgrades');
 +
 +}
 +
 +function openid_client_run_upgrades() {
 +        if (include_once(elgg_get_plugins_path() . 'upgrade-tools/lib/upgrade_tools.php')) {
 +                upgrade_module_run('openid_client');
 +        }
 +
 +}
 +
 +/**
 + * Set the correct subtype for OpenID users
 + *
 + * @param ElggUser $user New user
 + * @return void
 + */
 +function openid_client_set_subtype($user) {
 +	$db_prefix = elgg_get_config('dbprefix');
 +	$guid = (int)$user->getGUID();
 +	$subtype_id = (int)add_subtype('user', 'openid');
 +
 +	$query = "UPDATE {$db_prefix}entities SET subtype = $subtype_id WHERE guid = $guid";
 +	update_data($query);
 +}
 +
 +/**
 + * Add pages to the list of public pages for walled garden needed for OpenID
 + * transaction
 + *
 + * @param string $hook  Hook name
 + * @param string $type  Hook type
 + * @param array  $pages Array of public pages
 + * @return array
 + */
 +function openid_client_public($hook, $type, $pages) {
 +	$pages[] = 'action/openid_client/login';
 +	$pages[] = 'mod/openid_client/return.php';
 +	$pages[] = 'action/openid_client/register';
 +	return $pages;
 +}
 diff --git a/mod/openid_client/upgrade.php b/mod/openid_client/upgrade.php new file mode 100644 index 000000000..37248d484 --- /dev/null +++ b/mod/openid_client/upgrade.php @@ -0,0 +1,12 @@ +<?php +require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); + +admin_gatekeeper(); +set_time_limit(0); + +echo "upgrade microthemes"; +$previous_access = elgg_set_ignore_access(true); +openid_client_run_upgrades(); +elgg_set_ignore_access($previous_access); + +echo "DONE"; diff --git a/mod/openid_client/upgrades/2012100501.php b/mod/openid_client/upgrades/2012100501.php new file mode 100644 index 000000000..789a73e0a --- /dev/null +++ b/mod/openid_client/upgrades/2012100501.php @@ -0,0 +1,53 @@ +<?php + +global $MIGRATED; + +$local_version = (int)elgg_get_plugin_setting('version', 'openid_client'); +if (2012022501 <= $local_version) { +        error_log("Openid client requires no upgrade"); +        // no upgrade required +        return; +} + +/** + * Save previous author id + */ +function openid_client_user_2012100501($user) { +	$MIGRATED += 1; +	if ($MIGRATED % 100 == 0) { +		error_log(" * openid user $user->guid"); +	} + +	if ($user->alias) { +		$alias = $user->alias; +		if (strpos($alias, 'pg/profile') !== FALSE) { +			$alias = str_replace('pg/profile', 'profile', $alias); +		} +		error_log($alias); +		$user->annotate('openid_identifier', $alias, ACCESS_PUBLIC); +	} +	return true; +} + + + +/* + * Run upgrade. First users, then pads + */ +// users +$options = array('type' => 'user', 'limit' => 0); + +$MIGRATED = 0; + +$previous_access = elgg_set_ignore_access(true); +$batch = new ElggBatch('elgg_get_entities', $options, "openid_client_user_2012100501", 100); +elgg_set_ignore_access($previous_access); + +if ($batch->callbackResult) { +	error_log("Elgg openid users upgrade (201210050) succeeded"); +	elgg_set_plugin_setting('version', 2012022501, 'openid_client'); +} else { +	error_log("Elgg openid users upgrade (201210050) failed"); +} + + diff --git a/mod/openid_client/views/default/core/account/login_box.php b/mod/openid_client/views/default/core/account/login_box.php new file mode 100644 index 000000000..51b13398b --- /dev/null +++ b/mod/openid_client/views/default/core/account/login_box.php @@ -0,0 +1,24 @@ +<?php +/** + * Elgg login box + * + * @package Elgg + * @subpackage Core + * + * @uses $vars['module'] The module name. Default: aside + * @override views/default/core/account/login_box.php + */ + +$module = elgg_extract('module', $vars, 'aside'); + +$login_url = elgg_get_site_url(); +if (elgg_get_config('https_login')) { +	$login_url = str_replace("http:", "https:", $login_url); +} + +$title = elgg_echo('login'); +$body = elgg_view_form('login', array('action' => "{$login_url}action/login")); +$body .= elgg_view_form('openid_client/login', array('class' => 'elgg-form-login hidden'), array()); +$body .= elgg_view('openid_client/icon'); + +echo elgg_view_module($module, $title, $body); diff --git a/mod/openid_client/views/default/core/account/login_dropdown.php b/mod/openid_client/views/default/core/account/login_dropdown.php new file mode 100644 index 000000000..c3add2924 --- /dev/null +++ b/mod/openid_client/views/default/core/account/login_dropdown.php @@ -0,0 +1,31 @@ +<?php +/** + * Elgg drop-down login form + *  + * @override views/default/core/account/login_dropdown.php + */ + +if (elgg_is_logged_in()) { +	return true; +} + +$login_url = elgg_get_site_url(); +if (elgg_get_config('https_login')) { +	$login_url = str_replace("http:", "https:", elgg_get_site_url()); +} + +$body = elgg_view_form('login', array('action' => "{$login_url}action/login"), array('returntoreferer' => TRUE)); +$body .= elgg_view_form('openid_client/login', array('class' => 'elgg-form-login hidden'), array()); +$body .= elgg_view('openid_client/icon'); +?> +<div id="login-dropdown"> +	<?php  +		echo elgg_view('output/url', array( +			'href' => 'login#login-dropdown-box', +			'rel' => 'popup', +			'class' => 'elgg-button elgg-button-dropdown', +			'text' => elgg_echo('login'), +		));  +		echo elgg_view_module('dropdown', '', $body, array('id' => 'login-dropdown-box'));  +	?> +</div> diff --git a/mod/openid_client/views/default/forms/openid_client/login.php b/mod/openid_client/views/default/forms/openid_client/login.php new file mode 100644 index 000000000..1f440dc49 --- /dev/null +++ b/mod/openid_client/views/default/forms/openid_client/login.php @@ -0,0 +1,43 @@ +<?php +/** + * OpenID login if username or full url required + */ + +$options_values = array_flip(elgg_get_config('openid_providers')); +$options_values['others'] = elgg_echo('openid_client:others'); + +?> +<div> +<label><?php echo elgg_echo('openid_client:login:header'); ?></label> +<br /> +<?php +echo elgg_view('input/dropdown', array( +	'name' => 'openid_provider', +	'options_values' => $options_values, +)); +?> +</div> + +<div class="openid-client-url hidden"> +<label><?php echo elgg_echo('openid_client:url'); ?> </label> + +<?php +echo elgg_view('input/text', array('name' => 'openid_url', 'class' => 'mbs')); +?> + +</div> + +<div class="elgg-foot"> +	<label class="mtm float-alt"> +		<input type="checkbox" name="persistent" value="true" /> +		<?php echo elgg_echo('user:persistent'); ?> +	</label> +	 +	<?php echo elgg_view('input/submit', array('value' => elgg_echo('login'))); ?> +	 +	<?php  +	if (isset($vars['returntoreferer'])) { +		echo elgg_view('input/hidden', array('name' => 'returntoreferer', 'value' => 'true')); +	} +	?> +</div>
\ No newline at end of file diff --git a/mod/openid_client/views/default/forms/openid_client/register.php b/mod/openid_client/views/default/forms/openid_client/register.php new file mode 100644 index 000000000..6044f0f0b --- /dev/null +++ b/mod/openid_client/views/default/forms/openid_client/register.php @@ -0,0 +1,71 @@ +<?php +/** + * OpenID register form body + * + * @uses $vars['openid_identifier'] + * @uses $vars['username'] + * @uses $vars['is_username_available'] + * @uses $vars['is_username_valid'] + * @uses $vars['email'] + * @uses $vars['is_email_available'] + * @uses $vars['name'] + */ + +$username_label = elgg_echo('username'); +$username_warning = ''; +if (!elgg_extract('is_username_available', $vars, true)) { +	$username_warning = elgg_echo('openid_client:warning:username_not_available', array($vars['username'])); +	$username_warning = "($username_warning)"; +} else if (!elgg_extract('is_username_valid', $vars, true)) { +	$username_warning = elgg_echo('openid_client:warning:username_valid', array($vars['username'])); +	$username_warning = "($username_warning)"; +} +$username_input = elgg_view('input/text', array( +	'name' => 'username', +	'value' => $vars['username'], +)); + +$name_label = elgg_echo('name'); +$name_input = elgg_view('input/text', array( +	'name' => 'name', +	'value' => $vars['name'], +)); + +$email_label = elgg_echo('email'); +$email_available = elgg_extract('is_email_available', $vars, true); +$email_warning = ''; +if (!$email_available) { +	$email_warning = elgg_echo('openid_client:warning:email_not_available', array($vars['email'])); +	$email_warning = "($email_warning)"; +} +$email_input = elgg_view('input/email', array( +	'name' => 'email', +	'value' => $vars['email'], +	'readonly' => $email_available, +)); + +$openid_input = elgg_view('input/hidden', array( +	'name' => 'openid_identifier', +	'value' => $vars['openid_identifier'], +)); +$button = elgg_view('input/submit', array('value' => elgg_echo('save'))); + +echo <<<HTML +<div> +	<label>$username_label</label> $username_warning +	$username_input +</div> +<div> +	<label>$name_label</label> +	$name_input +</div> +<div> +	<label>$email_label</label> $email_warning +	$email_input +</div> +<div class="elgg-foot"> +	$openid_input +	$button +</div> + +HTML; diff --git a/mod/openid_client/views/default/openid_client/css.php b/mod/openid_client/views/default/openid_client/css.php new file mode 100644 index 000000000..d01fc6b5a --- /dev/null +++ b/mod/openid_client/views/default/openid_client/css.php @@ -0,0 +1,13 @@ +<?php
 +/**
 + * OpenID client CSS
 + */
 +?>
 +
 +.elgg-icon-openid {
 +	background-image: url(<?php echo elgg_get_site_url(); ?>mod/openid_client/graphics/openid_icon.png);
 +}
 +
 +.elgg-form-login {
 +	margin-bottom: 10px;
 +}
\ No newline at end of file diff --git a/mod/openid_client/views/default/openid_client/icon.php b/mod/openid_client/views/default/openid_client/icon.php new file mode 100644 index 000000000..3a9a9d981 --- /dev/null +++ b/mod/openid_client/views/default/openid_client/icon.php @@ -0,0 +1,8 @@ +<?php + +echo elgg_view('output/url', array( +	'text' => elgg_view_icon('openid') . elgg_echo('openid_client:login'), +	'href' => '', +	'title' => elgg_echo('openid_client'), +	'class' => "openid-login-icon", +));
\ No newline at end of file diff --git a/mod/openid_client/views/default/openid_client/js.php b/mod/openid_client/views/default/openid_client/js.php new file mode 100644 index 000000000..171215593 --- /dev/null +++ b/mod/openid_client/views/default/openid_client/js.php @@ -0,0 +1,26 @@ +<?php +/** + * OpenID JavaScript + */ + +?> + +// OpenID toggle +elgg.register_hook_handler('init', 'system', function() { +	$('.openid-login-icon').click(function(e) { +		var openid_box = $(this).prev('.elgg-form-openid-client-login'); +		var shown = openid_box.is(':visible') ? openid_box : openid_box.prev();  +		var hidden = !openid_box.is(':visible') ? openid_box : openid_box.prev(); +		shown.fadeOut(function() { +			hidden.fadeIn(); +		}); +		e.preventDefault(); +	}); +	$(".elgg-form-openid-client-login [name='openid_provider']").change(function(event) { +		if (this.value == 'others') { +			$(".openid-client-url").slideDown().find('input').focus(); +		} else { +			$(".openid-client-url").slideUp(); +		} +	}); +}); diff --git a/mod/openid_client/views/default/openid_client/register.php b/mod/openid_client/views/default/openid_client/register.php new file mode 100644 index 000000000..be448ef54 --- /dev/null +++ b/mod/openid_client/views/default/openid_client/register.php @@ -0,0 +1,11 @@ +<?php +/** + * Registration content view for OpenID client + * + */ + +echo '<p>'; +echo elgg_echo('openid_client:create:instructs'); +echo '<p>'; + +echo elgg_view_form('openid_client/register', array(), $vars);  | 
