Robert Vogel has submitted this change and it was merged.
Change subject: Latest sources from 'Hallo Welt! Medienwerkstatt GmbH' There
may be a newer version on the servers of webplatform.org
......................................................................
Latest sources from 'Hallo Welt! Medienwerkstatt GmbH' There may be a newer
version on the servers of webplatform.org
Change-Id: I9f7df3b0c6c1663624456d6a0c4a8b0aee4b5ef7
---
A WebPlatformAuth.i18n.php
A WebPlatformAuth.php
A includes/WebPlatformAuthHooks.php
A includes/api/ApiWebPlatformAuth.php
A includes/specials/WPA_RenewSession.php
5 files changed, 427 insertions(+), 0 deletions(-)
Approvals:
Robert Vogel: Verified; Looks good to me, approved
diff --git a/WebPlatformAuth.i18n.php b/WebPlatformAuth.i18n.php
new file mode 100644
index 0000000..38f6fdb
--- /dev/null
+++ b/WebPlatformAuth.i18n.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Internationalization file for the WebPlatformAuth extension.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+/** English
+ * @author Robert Vogel
+ */
+$messages['en'] = array(
+ 'webplatformauth-desc' => 'Enables MediaWiki to serve as
webplatform.org\'s authentication provider.'
+);
+
+/** Message documentation (Message documentation)
+ * @author Robert Vogel
+ */
+$messages['qqq'] = array(
+ 'webplatformauth-desc' => 'The extensions description'
+);
+
+/** German (Deutsch)
+ * @author Robert Vogel
+ */
+$messages['de'] = array(
+ 'webplatformauth-desc' => 'Macht aus MediaWiki einen
Authentifizierungsanbieter für webplatform.org'
+);
\ No newline at end of file
diff --git a/WebPlatformAuth.php b/WebPlatformAuth.php
new file mode 100644
index 0000000..362f5ed
--- /dev/null
+++ b/WebPlatformAuth.php
@@ -0,0 +1,52 @@
+<?php
+# Alert the user that this is not a valid entry point to MediaWiki if they try
to access the special pages file directly.
+if (!defined('MEDIAWIKI')) {
+ echo <<<EOT
+To install my extension, put the following line in LocalSettings.php:
+require_once( "$IP/extensions/WebPlatformAuth/WebPlatformAuth.php" );
+EOT;
+ exit( 1 );
+}
+
+$wgExtensionCredits['other'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'WebPlatformAuth',
+ 'author' => '[http://www.hallowelt.biz Hallo Welt!
Medienwerkstatt GmbH]; Robert Vogel',
+ 'url' => 'http://www.hallowelt.biz',
+ 'descriptionmsg' => 'webplatformauth-desc',
+ 'version' => '1.0.0; $Revision: 6738 $',
+);
+
+$dir = dirname(__FILE__) . '/';
+
+$wgAutoloadClasses['WebPlatformAuthHooks'] = $dir .
'includes/WebPlatformAuthHooks.php';
+$wgAutoloadClasses['ApiWebPlatformAuth'] = $dir .
'includes/api/ApiWebPlatformAuth.php';
+$wgAutoloadClasses['WPARenewSession'] = $dir .
'includes/specials/WPA_RenewSession.php';
+$wgExtensionMessagesFiles['WebPlatformAuth'] = $dir .
'WebPlatformAuth.i18n.php';
+
+$wgSpecialPages['RenewSession'] = 'WPARenewSession';
+//$wgWhitelistRead[] = 'Special:RenewSession';
+
+$wgAPIModules['webplatformauth'] = 'ApiWebPlatformAuth';
+
+$wgAjaxExportList[] = 'WebPlatformAuthHooks::ajaxGetUserInfoById';
+$wgAjaxExportList[] = 'WebPlatformAuthHooks::ajaxGetUserInfoByName';
+
+$wgHooks['UserLogoutComplete'][] =
'WebPlatformAuthHooks::onUserLogoutComplete';
+$wgHooks['UserLoginComplete'][] = 'WebPlatformAuthHooks::onUserLoginComplete';
+$wgHooks['UserSetCookies'][] = 'WebPlatformAuthHooks::onUserSetCookies';
+//$wgHooks['UserLoadFromSession'][] =
'WebPlatformAuthHooks::onUserLoadFromSession';
+$wgHooks['UserLoadAfterLoadFromSession'][] =
'WebPlatformAuthHooks::onUserLoadAfterLoadFromSession';
+//$wgHooks['UserLoadFromDatabase'][] =
'WebPlatformAuthHooks::onUserLoadFromDatabase';
+
+/**
+ * @deprecated Replaced by $wgWebPlatformAuthSecret, because in WPD setup IP
addresses ain't predictable enough
+ */
+$wgWebPlatformAuthAllowedClients = array(
+ 'localhost',
+ '127.0.0.1'
+);
+
+$wgWebPlatformAuthSecret =
'NqzdqcdCRWd1JZ1DXSI2Eq5BbjYra40nEguT8654C7eNrMldXuMDs4laHQIppAoc';
+
+$wgCookieDomain = '.webplatform.org'; // --> LocalSettings.php
\ No newline at end of file
diff --git a/includes/WebPlatformAuthHooks.php
b/includes/WebPlatformAuthHooks.php
new file mode 100644
index 0000000..5f46555
--- /dev/null
+++ b/includes/WebPlatformAuthHooks.php
@@ -0,0 +1,184 @@
+<?php
+
+class WebPlatformAuthHooks {
+
+ /**
+ *
+ * @param User $user
+ * @param string $inject_html
+ * @return boolean
+ */
+ public static function onUserLoginComplete( $user, &$inject_html ) {
+ $_SESSION['wsUserEmail'] = $user->getEmail();
+ //We've got to flatten the effective groups because MWs
MemchacheD
+ //session handler does not serialize $_SESSION correctly
+ // -> inludes/MemcachedClient.php:993
+ $_SESSION['wsUserEffectiveGroups'] = implode( ',',
$user->getEffectiveGroups() );
+ //$_SESSION['wsUserRealName'] = $user->getRealName();
+ $_SESSION['wsUserPageURL'] =
$user->getUserPage()->getFullURL();
+
+ self::writeDataToMemcache( $user );
+
+ self::checkReturnTo();
+
+ return true;
+ }
+
+ /**
+ *
+ * @param User $user
+ * @param string $inject_html
+ * @param string $oldName
+ * @return boolean
+ */
+ public static function onUserLogoutComplete($user, $inject_html,
$oldName) {
+ //TODO: Maybe
+ session_destroy();
+ self::checkReturnTo();
+
+ return true;
+ }
+
+ /**
+ *
+ * @param User $user User object
+ * @param array $session session array, will be added to $_SESSION
+ * @param array $cookies cookies array mapping cookie name to its value
+ * @return boolean
+ */
+ public static function onUserSetCookies( $user, &$session, &$cookies ) {
+ $session['wsUserEmail'] = $user->getEmail();
+ $session['wsUserEffectiveGroups'] =
implode(',',$user->getEffectiveGroups());
+ $session['wsUserPageURL'] =
$user->getUserPage()->getFullURL();
+
+ self::writeDataToMemcache( $user );
+ return true;
+ }
+
+ /**
+ *
+ * @param User $user User object
+ * @return boolean
+ */
+ public static function onUserLoadAfterLoadFromSession( $user ) {
+ $_SESSION['wsUserEmail'] = $user->getEmail();
+ $_SESSION['wsUserEffectiveGroups'] =
implode(',',$user->getEffectiveGroups());
+ $_SESSION['wsUserPageURL'] =
$user->getUserPage()->getFullURL();
+
+ self::writeDataToMemcache( $user );
+ return true;
+ }
+
+ /**
+ *
+ * @global WebRequest $wgRequest
+ * @global OutputPage $wgOut
+ */
+ public static function checkReturnTo() {
+ global $wgRequest;
+ $returnTo = $wgRequest->getVal('returnto');
+ if (!is_null($returnTo) && in_array( substr($returnTo, 0, 3),
array( 'qa|', 'wp|' ) ) ) {
+ //We have to exit() here because otherwise we would be
redirected to a MW page
+ header('Location: ' . substr($returnTo, 3));
+ exit();
+ }
+ }
+
+ /**
+ *
+ * @param string $userIds Comma seperated list of user ids
+ * @param string $secret A secret key to avoid unauthorized use of the
ajax interface
+ * @return string JSON encoded list of requested user information
+ */
+ public static function ajaxGetUserInfoById($userIds, $secret ) {
+ global $wgWebPlatformAuthSecret;
+ if( $secret != $wgWebPlatformAuthSecret ) {
+ return FormatJson::encode( new stdClass() );
+ }
+
+ $userIds = explode(',', $userIds);
+ $users = UserArray::newFromIDs($userIds);
+
+ $response = array();
+ foreach ($users as $user) {
+ $response[$user->getId()] = array(
+ 'user_name' => $user->getName(),
+ 'user_real_name' => $user->getRealName(),
+ 'user_email' => $user->getEmail(),
+ 'user_page_url' =>
$user->getUserPage()->getFullURL()
+ );
+ }
+
+ //In MW there is no user "0", but in Q2A
+ if( in_array( 0, $userIds ) ) {
+ $user = User::newFromId(1); //WikiSysop;
+ $response[0] = array(
+ 'user_name' => $user->getName(),
+ 'user_real_name' => $user->getRealName(),
+ 'user_email' => $user->getEmail(),
+ 'user_page_url' =>
$user->getUserPage()->getFullURL()
+ );
+ }
+
+ return FormatJson::encode($response);
+ }
+
+ /**
+ *
+ * @param string $userNames Comma seperated list of user names
+ * @param string $secret A secret key to avoid unauthorized use of the
ajax interface
+ * @return string JSON encoded list of requested user information
+ */
+ public static function ajaxGetUserInfoByName($userNames, $secret) {
+ global $wgWebPlatformAuthSecret;
+ if( $secret != $wgWebPlatformAuthSecret ) {
+ return FormatJson::encode( new stdClass() );
+ }
+
+ $userNames = explode(',', $userNames);
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select(
+ 'user',
+ 'user_id',
+ array( 'user_name' => $userNames )
+ );
+
+ $response = array();
+ foreach ( $res as $row ) {
+ $user = User::newFromId($row->user_id);
+ $response[$user->getId()] = array(
+ 'user_name' => $user->getName(),
+ 'user_real_name' => $user->getRealName(),
+ 'user_email' => $user->getEmail(),
+ 'user_page_url' =>
$user->getUserPage()->getFullURL()
+ );
+ }
+
+ return FormatJson::encode($response);
+ }
+
+ protected static function writeDataToMemcache( $user ) {
+ global $wgMemc;
+
+ if ( !is_object($user) ) return true;
+
+ $sesskey = false;
+ if ( isset( $_COOKIE[ 'wpwiki_session' ] ) ) {
+ $sesskey = $_COOKIE[ 'wpwiki_session' ];
+ }
+ if ( !$sesskey ) return true;
+
+ $memcAlternateSessionKey = 'wpwiki:altsession:'.$sesskey;
+ #error_log( "Docs Alternate Session Key: ".
$memcAlternateSessionKey );
+ #error_log( "UserId". $user->getId() );
+
+ $data = array();
+ $data['wsUserID'] = $user->getId();
+ $data['wsUserName'] = $user->getName();
+ $data['wsUserEmail'] = $user->getEmail();
+ $data['wsUserEffectiveGroups'] =
implode(',',$user->getEffectiveGroups());
+ $data['wsUserPageURL'] =
$user->getUserPage()->getFullURL();
+
+ $wgMemc->add( $memcAlternateSessionKey, serialize( $data ) );
+ }
+}
\ No newline at end of file
diff --git a/includes/api/ApiWebPlatformAuth.php
b/includes/api/ApiWebPlatformAuth.php
new file mode 100644
index 0000000..ff3757c
--- /dev/null
+++ b/includes/api/ApiWebPlatformAuth.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ *
+ *
+ * Created on Sep 29, 2012
+ *
+ * API module for MediaWiki's WebPlatformSearchAutocomplete extension
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup WebPlatformAuth
+ */
+class ApiWebPlatformAuth extends ApiBase {
+
+ public function __construct( $main, $action ) {
+ parent::__construct( $main, $action );
+ }
+
+ public function getCustomPrinter() {
+ return $this->getMain()->createPrinterByName( 'json' );
+ }
+
+ public function execute() {
+ global $wgSearchSuggestCacheExpiry, $wgWebPlatformAuthSecret;
+ $params = $this->extractRequestParams();
+
+ $command = $params['command'];
+ $users = $params['users'];
+ $secret = $params['secret'];
+
+ $result = $this->getResult();
+
+ if( $secret != $wgWebPlatformAuthSecret ) {
+ $result->addValue( null, 'result', new stdClass() );
+ return;
+ }
+
+ $users = explode(',', $users);
+ $userlist = array();
+
+ if( $command == 'GetUsersById' ) {
+ $userlist = UserArray::newFromIDs($users);
+ }
+ else if( $command == 'GetUsersByName' ) {
+ $res = $this->getDB()->select(
+ 'user',
+ 'user_id',
+ array( 'user_name' => $users )
+ );
+ foreach ( $res as $row ) {
+ $userlist[] = User::newFromId($row->user_id);
+ }
+ }
+
+ $response = array();
+ foreach( $userlist as $user ) {
+ $response[$user->getId()] = array(
+ 'user_id' => $user->getId(),
+ 'user_name' => $user->getName(),
+ 'user_real_name' => $user->getRealName(),
+ 'user_email' => $user->getEmail(),
+ 'user_page_url' =>
$user->getUserPage()->getFullURL()
+ );
+ }
+
+ //In MW there is no user "0", but in Q2A
+ if( in_array( 0, $users ) ) {
+ $user = User::newFromId(1); //WikiSysop;
+ $response[0] = array(
+ 'user_id' => 0,
+ 'user_name' => $user->getName(),
+ 'user_real_name' => $user->getRealName(),
+ 'user_email' => $user->getEmail(),
+ 'user_page_url' =>
$user->getUserPage()->getFullURL()
+ );
+ }
+
+ // Open search results may be stored for a very long time
+ $this->getMain()->setCacheMaxAge( $wgSearchSuggestCacheExpiry );
+ $this->getMain()->setCacheMode( 'public' );
+
+ // Set top level elements
+ $result->addValue( null, 'users', $response );
+ }
+
+ public function isReadMode() { //Needed to be always available, even if
read-api is not allowed
+ return false;
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'command' => null,
+ 'users' => null,
+ 'secret' => null,
+ );
+ }
+
+ public function getParamDescription() {
+ return false;
+ return array(
+ 'command' => 'GetUsersById|GetUsersByName',
+ 'users' => 'Comma seperated list of either user names
or user ids. Depends on given command.',
+ );
+ }
+
+ public function getDescription() {
+ return false;
+ return 'User information provider for the webplatform.org
applications';
+ }
+
+ public function getExamples() {
+ return false;
+ return array(
+
'api.php?action=webplatformauth&command=GetUsersById&users=45,23,56'
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.webplatform.org';
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiWebPlatformAuth.php 6651
2012-09-30 22:33:29Z mglaser $';
+ }
+}
diff --git a/includes/specials/WPA_RenewSession.php
b/includes/specials/WPA_RenewSession.php
new file mode 100644
index 0000000..42d4de4
--- /dev/null
+++ b/includes/specials/WPA_RenewSession.php
@@ -0,0 +1,19 @@
+<?php
+class WPARenewSession extends UnlistedSpecialPage {
+
+ /**
+ * Constructor
+ */
+ function __construct() {
+ parent::__construct( 'RenewSession' );
+ }
+
+ function execute( $par ) {
+ global $wgUser;
+ $_SESSION['wsUserEmail'] = $wgUser->getEmail();
+ $_SESSION['wsUserEffectiveGroups'] =
implode(',',$wgUser->getEffectiveGroups());
+ $_SESSION['wsUserPageURL'] =
$wgUser->getUserPage()->getFullURL();
+
+ $this->getOutput()->redirect( $par );
+ }
+}
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/76102
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I9f7df3b0c6c1663624456d6a0c4a8b0aee4b5ef7
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WebPlatformAuth
Gerrit-Branch: master
Gerrit-Owner: Robert Vogel <[email protected]>
Gerrit-Reviewer: Robert Vogel <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits