Seditio Source
Root |
./othercms/ips_4.3.4/applications/core/extensions/core/GroupLimits/GroupLimits.php
<?php
/**
 * @brief        Group Limits
 * @author        <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright    (c) Invision Power Services, Inc.
 * @license        https://www.invisioncommunity.com/legal/standards/
 * @package        Invision Community
 * @since        07 Nov 2013
 */

namespace IPS\core\extensions\core\GroupLimits;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
   
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

/**
 * Group Limits
 *
 * This extension is used to define which limit values "win" when a user has secondary groups defined
 *
 */
class _GroupLimits
{
   
/**
     * Get group limits by priority
     *
     * @return    array
     */
   
public function getLimits()
    {
        return array(
           
'exclude'         => array( 'g_id', 'g_icon', 'prefix', 'suffix', 'g_promotion', 'g_bitoptions' ),
           
'lessIsMore'    => array( 'g_search_flood', 'g_pm_flood_mins' ),
           
'neg1IsBest'    => array( 'g_attach_max', 'g_max_bgimg_upload', 'g_max_messages', 'g_pm_perday', 'g_pm_flood_mins', 'g_max_mass_pm', 'g_rep_max_positive' ),
           
'zeroIsBest'    => array( 'g_edit_cutoff', 'g_displayname_unit', 'g_sig_unit', 'g_mod_preview', 'g_ppd_limit', 'g_ppd_unit', 'gbw_no_status_update', 'g_max_bgimg_upload', 'gbw_disable_prefixes', 'gbw_disable_tagging', 'g_attach_per_post' ),
           
'callback'        => array(
               
'g_signature_limits'        => array( $this, '_signatureLimits' ),
               
'g_photo_max_vars'            => array( $this, '_photoVars' ),
               
'g_dname_date'                => array( $this, '_displayNameDate' ),
               
'g_dname_changes'            => array( $this, '_displayNameChanges' ),
               
'gbw_mod_post_unit_type'    => array( $this, '_modPostUnitType' ),
               
'g_mod_post_unit'            => array( $this, '_modPostUnit' ),
               
'g_edit_posts'                => array( $this, '_perAppSettings' ),
               
'g_hide_own_posts'            => array( $this, '_perAppSettings' ),
               
'g_delete_own_posts'        => array( $this, '_perAppSettings' ),
               
'g_lock_unlock_own'            => array( $this, '_perAppSettings' ),
               
'g_can_report'                => array( $this, '_perAppSettings' ),
               
'g_club_allowed_nodes'        => array( $this, '_clubNodes' ),
            )
        );
    }
   
   
/**
     * Per-App Settings
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _perAppSettings( $a, $b, $k, $member )
    {
        if (
$a[ $k ] == 1 or $b[ $k ] == 1 )
        {
            return
1;
        }
       
        if (
$a[ $k ] and $b[ $k ] )
        {
            return
implode( ',', array_unique( array_merge( explode( ',', $a[ $k ] ), explode( ',', $b[ $k ] ) ) ) );
        }
        elseif (
$a[ $k ] )
        {
            return
$a[ $k ];
        }
        elseif (
$b[ $k ] )
        {
            return
$b[ $k ];
        }
       
        return
0;
    }
   
   
/**
     * Signature Limits
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _signatureLimits( $a, $b, $k, $member )
    {
       
/* No limits should win out */
       
if( !$a[ $k ] )
        {
            return
null;
        }
       
       
/* We have limits */
       
if( $b[ $k ] )
        {
           
$values    = explode( ':', $b[ $k ] );
           
$_cur    = explode( ':', $a[ $k ] );
           
$_new     = array();

           
/* If the group can't use signatures, ignore any limits saved for the group */
           
if( $_cur[0] )
            {
                return
$b[ $k ];
            }

            if(
$values[0] )
            {
                return
$a[ $k ];
            }

            foreach(
$values as $index => $value )
            {
                if(
$_cur[ $index ] == "" or $values[ $index ] == "" )
                {
                   
$_new[ $index ]    = NULL;
                }
               
/* If signatures are currently disabled but aren't in the group we are checking, signatures should not be disabled (1=disabled, 0=enabled) */
               
elseif ( $index == 0 and $_cur[ $index ] > $values[ $index ] )
                {
                   
$_new[ $index ]    = $values[ $index ];
                }
               
/* If signatures are currently enabled but aren't in the group we are checking, signatures should not be disabled */
               
elseif ( $index == 0 and $_cur[ $index ] < $values[ $index ] )
                {
                   
$_new[ $index ]    = $_cur[ $index ];
                }
                else if(
$_cur[ $index ] > $values[ $index ] )
                {
                   
$_new[ $index ]    = $_cur[ $index ];
                }
                else
                {
                   
$_new[ $index ]    = $values[ $index ];
                }

               
/* If we are not allowed to use any images, ignore the dimensions specified.
                 Otherwise group A with 0 images and no limits on sizes and group B with 1 images at 200x200 results in 1 image allowed unlimited sizes. */
               
if( ( $index == 2 OR $index == 3 ) AND $values[1] == 0 )
                {
                   
$_new[ $index ] = $_cur[ $index ];
                }
            }
                                                       
           
ksort($_new);
            return
implode( ':', $_new );
        }
        else
        {
           
/* Set no limits */
           
return NULL;
        }
    }
   
   
/**
     * Photo Settings
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _photoVars( $a, $b, $k, $member )
    {
       
/* No limits should win out */
       
if( !$a[ $k ] )
        {
            return
NULL;
        }
           
       
/* We have limits */
       
if( $b[ $k ] )
        {
           
$values    = explode( ':', $b[ $k ] );
           
$_cur    = explode( ':', $a[ $k ] );
           
$_new     = array();
       
            foreach(
$values as $index => $value )
            {
                if( !
$_cur[ $index ] or !$values[ $index ] )
                {
                   
$_new[ $index ]    = NULL;
                }
                else if(
$_cur[ $index ] > $values[ $index ] )
                {
                   
$_new[ $index ]    = $_cur[ $index ];
                }
                else
                {
                   
$_new[ $index ]    = $values[ $index ];
                }
            }
               
           
ksort($_new);
            return
implode( ':', $_new );
        }
        else
        {
           
/* Set no limits */
           
return NULL;
        }
    }
   
   
/**
     * Display Name Date
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _displayNameDate( $a, $b, $k, $member )
    {
       
/* This is handled by g_dname_changes below */
       
return $a['g_dname_date'];
    }
   
   
/**
     * Display Name Changes
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _displayNameChanges( $a, $b, $k, $member )
    {
       
$changes    = $b[ $k ];
       
/* Get the most generous date allowance */
       
$timeFrame    = max( array( $a['g_dname_date'], $b['g_dname_date'] ) );

        if(
$changes == -1 OR $a[ $k ] == -1 )
        {
            return array(
               
'g_dname_date'        => 0,
               
'g_dname_changes'    => -1
           
);
        }

       
/* No time frame restriction */
       
if( !$timeFrame )
        {
           
/* This group allows more changes */
           
if( $changes > $a[ $k ] )
            {
                return array(
                   
'g_dname_date'        => 0,
                   
'g_dname_changes'    => $changes
               
);
            }
           
           
/* Existing data is date restricted */
           
else if( $a['g_dname_date'] )
            {
                if(
$a[ $k ] )
                {
                   
$_compare    = round( $a['g_dname_date'] / $a[ $k ] );
                   
                    if(
$_compare > $changes )
                    {
                        return array(
                           
'g_dname_date'        => 0,
                           
'g_dname_changes'    => $changes
                       
);
                    }
                }
            }
        }
       
       
/* Time frame restriction */
       
else if( $changes )
        {
           
$_compare    = round( $timeFrame / $changes );
           
           
/* If there are no permitted changes allowed for group A, but there is a date set (is is default, then clear the date for the logic below */
           
if ( ! $a[ $k ] and $a['g_dname_date'] )
            {
               
$a['g_dname_date'] = 0;
            }
           
           
/* Existing has no time frame restriction */
           
if( !$a['g_dname_date'] AND $a[ $k ] )
            {
                if(
$_compare < $a[ $k ] )
                {
                    return array(
                       
'g_dname_date'        => $timeFrame,
                       
'g_dname_changes'    => $changes
                   
);
                }
            }
            else if( !
$a['g_dname_date'] )
            {
                return array(
                   
'g_dname_date'        => $timeFrame,
                   
'g_dname_changes'    => $changes
               
);
            }
            else if(
$a['g_dname_date'] AND $a[ $k ] )
            {
               
$_oldCompare    = $a['g_dname_date'] / $a[ $k ];

                if(
$_compare < $_oldCompare )
                {
                    return array(
                       
'g_dname_date'        => $timeFrame,
                       
'g_dname_changes'    => $changes
                   
);
                }
            }
        }
    }
   
   
/**
     * gbw_mod_post_unit_type
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _modPostUnitType( $a, $b, $k, $member )
    {
       
/* This is handled by g_mod_post_unit below */
       
return $a['gbw_mod_post_unit_type'];
    }
   
   
/**
     * g_mod_post_unit
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _modPostUnit( $a, $b, $k, $member )
    {
       
/* Have we met the current requirements? */
       
if ( ( !$a['gbw_mod_post_unit_type'] and $a['g_mod_post_unit'] >= $member['member_posts'] ) or ( $a['gbw_mod_post_unit_type'] and time() >= ( $member['joined'] + ( $a['g_mod_post_unit'] * 3600 ) ) ) )
        {
           
/* Yes - so let's stick with this */
           
return $a['g_mod_post_unit'];
        }
        else
        {
           
/* No - go with the new group */
           
return array(
               
'g_mod_post_unit'            => $b[ $k ],
               
'gbw_mod_post_unit_type'    => $b['gbw_mod_post_unit_type']
            );
        }
    }

   
/**
     * Available node types for clubs
     *
     * @param    array    $a        Group A's values
     * @param    array    $b        Group B's values
     * @param    string    $k        The key we want to get the combined value for
     * @param    array    $member    Member data
     * @return    mixed
     */
   
public function _clubNodes( $a, $b, $k, $member )
    {
        if (
$a[$k] == '*' or $b[$k] == '*' )
        {
            return
'*';
        }

       
/* We need to merge all content types */
       
$nodeTypes = array_unique( array_merge( explode( ",", $a[$k]), explode( ",", $b[$k]) ) );

        return
implode( ",", $nodeTypes );
    }
}