Thread:Extension talk:LDAP Authentication/Patch not to override user preferences

Hello

I'm not sure this is a place for a patch so tell me if I'm wrong.

I want to load user attributes from LDAP while allowing users to change their nicknames(or signatures) or real names. So I added an option to control whether override the current MediaWiki user preferences or not.

I'm submitting the patch. I would like to have this feature in the extension.

patch: --- C:/Users/iwao/Downloads/LdapAuthentication.trunk.php	Thu Jan 12 09:38:09 2012 +++ C:/Users/iwao/Downloads/LdapAuthentication.php	Thu Jan 12 13:30:21 2012 @@ -53,6 +53,7 @@ $wgLDAPPasswordHash = array; $wgLDAPMailPassword = array; $wgLDAPPreferences = array; +$wgLDAPPreferencesNoOverride = array; $wgLDAPDisableAutoCreate = array; $wgLDAPDebug = 0; $wgLDAPGroupUseFullDN = array; @@ -389,6 +390,9 @@ 		case 'Preferences': global $wgLDAPPreferences; return self::setOrDefault( $wgLDAPPreferences, $domain, array ); +		case 'PreferencesNoOverride': +			global $wgLDAPPreferencesNoOverride; +			return self::setOrDefault( $wgLDAPPreferencesNoOverride, $domain, array ); case 'DisableAutoCreate': global $wgLDAPDisableAutoCreate; return self::setOrDefault( $wgLDAPDisableAutoCreate, $domain, false ); @@ -1042,6 +1046,27 @@ 	} 	/** +	 * Check if the current user preference is invalid and to update +	 * +	 * @param $pref Preference to set +	 * @param $oldvalue Old value stored in MediaWiki +	 * @param $newvalue New value to set +	 */ +	private function isUserPreferenceInvalid( $pref, $oldvalue, $newvalue ) { +		$this->printDebug( "Entering isUserPreferenceInvalid", NONSENSITIVE ); +		$nooverride = $this->getConf( 'PreferencesNoOverride' ); +		$this->printDebug( $nooverride [ $pref ] ? 'true' : 'false', NONSENSITIVE); +		if ( $newvalue ) { +			if ( is_null( $oldvalue ) || +			    ( !isset( $nooverride[ $pref ] ) || $nooverride[ $pref ] ) ) { + +				return true; +			}			     +		} +		return false; +	} + +	/** 	 * When a user logs in, update user with information from LDAP. * 	 * @param $user User @@ -1058,24 +1083,27 @@ 		if ( $this->getConf( 'Preferences' ) ) { $this->printDebug( "Setting user preferences.", NONSENSITIVE ); -			if ( $this->lang ) { +			if ( $this->isUserPreferenceInvalid( 'language', $user->getOption('language'), $this->lang ) ) { $this->printDebug( "Setting language.", NONSENSITIVE ); $user->setOption( 'language', $this->lang ); +				$saveSettings = true; } -			if ( $this->nickname ) { +			if ( $this->isUserPreferenceInvalid( 'nickname', $user->getOption( 'nickname' ), $this->nickname ) ) { $this->printDebug( "Setting nickname.", NONSENSITIVE ); $user->setOption( 'nickname', $this->nickname ); +				$saveSettings = true; } -			if ( $this->realname ) { +			if ( $this->isUserPreferenceInvalid( 'realname', $user->getRealName, $this->realname ) ) { $this->printDebug( "Setting realname.", NONSENSITIVE ); $user->setRealName( $this->realname ); +				$saveSettings = true; } -			if ( $this->email ) { +			if ( $this->isUserPreferenceInvalid( 'email', $user->getEmail, $this->email ) ) { $this->printDebug( "Setting email.", NONSENSITIVE ); $user->setEmail( $this->email ); $user->confirmEmail; +				$saveSettings = true; } -			$saveSettings = true; } 		if ( $this->getConf( 'UseLDAPGroups' ) ) {

Options shall be specified like this: $wgLDAPPreferencesNoOverride = array( "mydomain" => array( "realname" => true, "nickname" => false )  ); If not specified, user preferences will be overridden.