<?php if( !defined( 'MEDIAWIKI' )) die( -1 ); # guard against stray browsers final class MailishUsername { # Canonicalizes an email address. Returns the canonical form. # static function canonicalEmail( $email ) { # cf. votorola.g.mail.InternetAddressX.canonicalize() $a = strpos( $email, '@' ); if( !$a ) return $email; # won't actually occur, assuming isValidEmailAddr return substr($email,0,$a) . '@' . strtolower(substr($email,$a+1)); } # Translates a canonical email address to a username. Returns the username. # static function emailToUsername( $email ) { # cf. http://reluk.ca/project/votorola/_/javadoc/votorola/a/voter/IDPair.html#appendUsername(java.lang.String,%20java.lang.StringBuilder) $u = ''; # so far $cN = strlen( $email ); # First character # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $c = 0; { $ch = substr( $email, $c++, 1 ); $chUp = strtoupper( $ch ); $u .= $chUp; if( $ch == $chUp ) $atSurrogateChar = ' '; else $atSurrogateChar = '-'; } # Remainder of local part and at-surrogate # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for( ;; ) { if( $c >= $cN ) return $u; # error, no '@' $ch = substr( $email, $c++, 1 ); if( $ch == '@' ) break; elseif( $ch == '_' ) $ch = ' '; # normalize $u .= $ch; } $u .= $atSurrogateChar; # Domain name # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $u .= strtoupper( substr( $email, $c++, 1 )); for(; $c < $cN; ) { $ch = substr( $email, $c++, 1 ); if( $ch == '.' ) $ch = strtoupper( substr( $email, $c++, 1 )); # collapse '.' $u .= $ch; } return $u; } # Hook for 'LoginPosted'. # static function loginPosted( $form ) { global $wgRequest; $ret = true; # continue hook processing $email = $form->mEmail; if( MailishUtil::endsWith( $email, '@wiki' )) { global $wgPasswordSender; # Translate NAME@wiki to NAME. The form NAME@wiki is designed to fool the # validator for the email field (it rejected the previous form .NAME). # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $name = substr( $email, 0, strlen($email) - 5 ); # - - - $email = $wgPasswordSender; # should suffice, as these accounts are for local admins $form->mEmail = $email; $wgRequest->setVal( 'wpEmail', $email ); # hack per 'wpName' below, though not sure it's needed for 'wpEmail' } else { if( !User::isValidEmailAddr( $email )) return $ret; # actually only checks for '@', though the new validator for the email field # introduced in 1.20 or 1.21 does that much already # Translate email address to mailish username. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $name = self::emailToUsername( self::canonicalEmail( $email )); } $form->mUsername = $name; $wgRequest->setVal( 'wpName', $name ); # Faking it back into the request as though input to the form in the first # place. Ugly hack, but otherwise the 'Email new password' facility fails: # http://groups.google.com/group/votorola/t/8d9b3630b81b28e1 return $ret; } }