Note incorrect docs in DefaultSettings.php
[lhc/web/wiklou.git] / includes / Autopromote.php
index 76d6f2a..c8a4c03 100644 (file)
@@ -8,7 +8,7 @@ class Autopromote {
        /**
         * Get the groups for the given user based on $wgAutopromote.
         *
-        * @param User $user The user to get the groups for
+        * @param $user The user to get the groups for
         * @return array Array of groups to promote to.
         */
        public static function getAutopromoteGroups( User $user ) {
@@ -18,7 +18,10 @@ class Autopromote {
                        if( self::recCheckCondition( $cond, $user ) )
                                $promote[] = $group;
                }
-               return array_unique( $promote );
+               
+               wfRunHooks( 'GetAutoPromoteGroups', array( $user, &$promote ) );
+               
+               return $promote;
        }
 
        /**
@@ -33,12 +36,12 @@ class Autopromote {
         * This function evaluates the former type recursively, and passes off to
         * self::checkCondition for evaluation of the latter type.
         *
-        * @param mixed $cond A condition, possibly containing other conditions
-        * @param User  $user The user to check the conditions against
+        * @param $cond Mixed: a condition, possibly containing other conditions
+        * @param $user The user to check the conditions against
         * @return bool Whether the condition is true
         */
        private static function recCheckCondition( $cond, User $user ) {
-               $validOps = array( '&', '|', '^' );
+               $validOps = array( '&', '|', '^', '!' );
                if( is_array( $cond ) && count( $cond ) >= 2 && in_array( $cond[0], $validOps ) ) {
                        # Recursive condition
                        if( $cond[0] == '&' ) {
@@ -47,7 +50,7 @@ class Autopromote {
                                                return false;
                                return true;
                        } elseif( $cond[0] == '|' ) {
-                               foreach( array_slice( $cond, 1 ) as $subcond ) 
+                               foreach( array_slice( $cond, 1 ) as $subcond )
                                        if( self::recCheckCondition( $subcond, $user ) )
                                                return true;
                                return false;
@@ -60,6 +63,11 @@ class Autopromote {
                                                $res = ($res xor self::recCheckCondition( $subcond, $user ));
                                }
                                return $res;
+                       } elseif ( $cond[0] = '!' ) {
+                               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-
@@ -75,8 +83,8 @@ class Autopromote {
         * APCOND_AGE.  Other types will throw an exception if no extension evalu-
         * ates them.
         *
-        * @param array $cond A condition, which must not contain other conditions
-        * @param User  $user The user to check the condition against
+        * @param $cond Array: A condition, which must not contain other conditions
+        * @param $user The user to check the condition against
         * @return bool Whether the condition is true for the user
         */
        private static function checkCondition( $cond, User $user ) {
@@ -87,7 +95,7 @@ class Autopromote {
                                if( User::isValidEmailAddr( $user->getEmail() ) ) {
                                        global $wgEmailAuthentication;
                                        if( $wgEmailAuthentication ) {
-                                               return $user->getEmailAuthenticationTimestamp() ? true : false;
+                                               return (bool)$user->getEmailAuthenticationTimestamp();
                                        } else {
                                                return true;
                                        }
@@ -98,6 +106,16 @@ class Autopromote {
                        case APCOND_AGE:
                                $age = time() - wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
                                return $age >= $cond[1];
+                       case APCOND_AGE_FROM_EDIT:
+                               $age = time() - wfTimestampOrNull( TS_UNIX, $user->getFirstEditTimestamp() );
+                               return $age >= $cond[1];
+                       case APCOND_INGROUPS:
+                               $groups = array_slice( $cond, 1 );
+                               return count( array_intersect( $groups, $user->getGroups() ) ) == count( $groups );
+                       case APCOND_ISIP:
+                               return $cond[1] == wfGetIP();
+                       case APCOND_IPINRANGE:
+                               return IP::isInRange( wfGetIP(), $cond[1] );
                        default:
                                $result = null;
                                wfRunHooks( 'AutopromoteCondition', array( $cond[0], array_slice( $cond, 1 ), $user, &$result ) );