X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FAutopromote.php;h=d7ed2f904b9bca50921c9eb5c7d25699ef830ba5;hb=9816dcbe8e47d54aeb9fbac9bb84caeab37e53c1;hp=c0adff43a47779accb5e0d0f371322eeca376ee3;hpb=f8b1c4cfb7a9f55e94751ad89306f7712391c38e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Autopromote.php b/includes/Autopromote.php index c0adff43a4..d7ed2f904b 100644 --- a/includes/Autopromote.php +++ b/includes/Autopromote.php @@ -1,4 +1,26 @@ $cond ) { - if( self::recCheckCondition( $cond, $user ) ) + + foreach ( $wgAutopromote as $group => $cond ) { + if ( self::recCheckCondition( $cond, $user ) ) { $promote[] = $group; + } } wfRunHooks( 'GetAutoPromoteGroups', array( $user, &$promote ) ); @@ -23,9 +48,48 @@ class Autopromote { return $promote; } + /** + * Get the groups for the given user based on the given criteria. + * + * Does not return groups the user already belongs to or has once belonged. + * + * @param $user User The user to get the groups for + * @param $event String key in $wgAutopromoteOnce (each one has groups/criteria) + * + * @return array Groups the user should be promoted to. + * + * @see $wgAutopromoteOnce + */ + public static function getAutopromoteOnceGroups( User $user, $event ) { + global $wgAutopromoteOnce; + + $promote = array(); + + if ( isset( $wgAutopromoteOnce[$event] ) && count( $wgAutopromoteOnce[$event] ) ) { + $currentGroups = $user->getGroups(); + $formerGroups = $user->getFormerGroups(); + foreach ( $wgAutopromoteOnce[$event] as $group => $cond ) { + // Do not check if the user's already a member + if ( in_array( $group, $currentGroups ) ) { + continue; + } + // Do not autopromote if the user has belonged to the group + if ( in_array( $group, $formerGroups ) ) { + continue; + } + // Finally - check the conditions + if ( self::recCheckCondition( $cond, $user ) ) { + $promote[] = $group; + } + } + } + + return $promote; + } + /** * Recursively check a condition. Conditions are in the form - * array( '&' or '|' or '^', cond1, cond2, ... ) + * array( '&' or '|' or '^' or '!', cond1, cond2, ... ) * where cond1, cond2, ... are themselves conditions; *OR* * APCOND_EMAILCONFIRMED, *OR* * array( APCOND_EMAILCONFIRMED ), *OR* @@ -36,43 +100,52 @@ class Autopromote { * self::checkCondition for evaluation of the latter type. * * @param $cond Mixed: a condition, possibly containing other conditions - * @param $user The user to check the conditions against + * @param $user User The user to check the conditions against * @return bool Whether the condition is true */ private static function recCheckCondition( $cond, User $user ) { $validOps = array( '&', '|', '^', '!' ); - if( is_array( $cond ) && count( $cond ) >= 2 && in_array( $cond[0], $validOps ) ) { + + if ( is_array( $cond ) && count( $cond ) >= 2 && in_array( $cond[0], $validOps ) ) { # Recursive condition - if( $cond[0] == '&' ) { - foreach( array_slice( $cond, 1 ) as $subcond ) - if( !self::recCheckCondition( $subcond, $user ) ) + if ( $cond[0] == '&' ) { // AND (all conds pass) + foreach ( array_slice( $cond, 1 ) as $subcond ) { + if ( !self::recCheckCondition( $subcond, $user ) ) { return false; + } + } + return true; - } elseif( $cond[0] == '|' ) { - foreach( array_slice( $cond, 1 ) as $subcond ) - if( self::recCheckCondition( $subcond, $user ) ) + } elseif ( $cond[0] == '|' ) { // OR (at least one cond passes) + foreach ( array_slice( $cond, 1 ) as $subcond ) { + if ( self::recCheckCondition( $subcond, $user ) ) { return true; + } + } + return false; - } elseif( $cond[0] == '^' ) { - $res = null; - foreach( array_slice( $cond, 1 ) as $subcond ) { - if( is_null( $res ) ) - $res = self::recCheckCondition( $subcond, $user ); - else - $res = ($res xor self::recCheckCondition( $subcond, $user )); + } elseif ( $cond[0] == '^' ) { // XOR (exactly one cond passes) + if ( count( $cond ) > 3 ) { + wfWarn( 'recCheckCondition() given XOR ("^") condition on three or more conditions. Check your $wgAutopromote and $wgAutopromoteOnce settings.' ); } - return $res; - } elseif ( $cond[0] = '!' ) { - foreach( array_slice( $cond, 1 ) as $subcond ) - if( self::recCheckCondition( $subcond, $user ) ) + return self::recCheckCondition( $cond[1], $user ) + xor self::recCheckCondition( $cond[2], $user ); + } elseif ( $cond[0] == '!' ) { // NOT (no conds pass) + foreach ( array_slice( $cond, 1 ) as $subcond ) { + if ( self::recCheckCondition( $subcond, $user ) ) { return false; + } + } + return true; } } # If we got here, the array presumably does not contain other condi- # tions; it's not recursive. Pass it off to self::checkCondition. - if( !is_array( $cond ) ) + if ( !is_array( $cond ) ) { $cond = array( $cond ); + } + return self::checkCondition( $cond, $user ); } @@ -83,17 +156,20 @@ class Autopromote { * ates them. * * @param $cond Array: A condition, which must not contain other conditions - * @param $user The user to check the condition against + * @param $user User The user to check the condition against + * @throws MWException * @return bool Whether the condition is true for the user */ private static function checkCondition( $cond, User $user ) { - if( count( $cond ) < 1 ) + global $wgEmailAuthentication; + if ( count( $cond ) < 1 ) { return false; + } + switch( $cond[0] ) { case APCOND_EMAILCONFIRMED: - if( User::isValidEmailAddr( $user->getEmail() ) ) { - global $wgEmailAuthentication; - if( $wgEmailAuthentication ) { + if ( Sanitizer::validateEmail( $user->getEmail() ) ) { + if ( $wgEmailAuthentication ) { return (bool)$user->getEmailAuthenticationTimestamp(); } else { return true; @@ -112,18 +188,21 @@ class Autopromote { $groups = array_slice( $cond, 1 ); return count( array_intersect( $groups, $user->getGroups() ) ) == count( $groups ); case APCOND_ISIP: - return $cond[1] == wfGetIP(); + return $cond[1] == $user->getRequest()->getIP(); case APCOND_IPINRANGE: - return IP::isInRange( wfGetIP(), $cond[1] ); + return IP::isInRange( $user->getRequest()->getIP(), $cond[1] ); case APCOND_BLOCKED: return $user->isBlocked(); + case APCOND_ISBOT: + return in_array( 'bot', User::getGroupPermissions( $user->getGroups() ) ); default: $result = null; wfRunHooks( 'AutopromoteCondition', array( $cond[0], array_slice( $cond, 1 ), $user, &$result ) ); - if( $result === null ) { + if ( $result === null ) { throw new MWException( "Unrecognized condition {$cond[0]} for autopromotion!" ); } - return $result ? true : false; + + return (bool)$result; } } }