Changeset 25245


Ignore:
Timestamp:
Oct 30, 2013, 9:29:48 PM (7 years ago)
Author:
mistic100
Message:

feature 2976: add three methods for permissions management

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/ws_functions.inc.php

    r25237 r25245  
    36253625/**
    36263626 * API method
     3627 * Updates users
    36273628 * @param mixed[] $params
    36283629 *    @option int[] user_id
     
    38123813}
    38133814
     3815/**
     3816 * API method
     3817 * Returns permissions
     3818 * @param mixed[] $params
     3819 *    @option int[] cat_id (optional)
     3820 *    @option int[] group_id (optional)
     3821 *    @option int[] user_id (optional)
     3822 */
     3823function ws_permissions_getList($params, &$service)
     3824{
     3825  $my_params = array_intersect(array_keys($params), array('cat_id','group_id','user_id'));
     3826  if (count($my_params) > 1)
     3827  {
     3828    return new PwgError(WS_ERR_INVALID_PARAM, 'Too many parameters, provide cat_id OR user_id OR group_id');
     3829  }
     3830 
     3831  $cat_filter = '';
     3832  if (!empty($params['cat_id']))
     3833  {
     3834    $cat_filter = 'WHERE cat_id IN('. implode(',', $params['cat_id']) .')';
     3835  }
     3836 
     3837  $perms = array();
     3838 
     3839  // direct users
     3840  $query = '
     3841SELECT user_id, cat_id
     3842  FROM '. USER_ACCESS_TABLE .'
     3843  '. $cat_filter .'
     3844;';
     3845  $result = pwg_query($query);
     3846
     3847  while ($row = pwg_db_fetch_assoc($result))
     3848  {
     3849    if (!isset($perms[ $row['cat_id'] ]))
     3850    {
     3851      $perms[ $row['cat_id'] ]['id'] = $row['cat_id'];
     3852    }
     3853    $perms[ $row['cat_id'] ]['users'][] = $row['user_id'];
     3854  }
     3855 
     3856  // indirect users
     3857  $query = '
     3858SELECT ug.user_id, ga.cat_id
     3859  FROM '. USER_GROUP_TABLE .' AS ug
     3860    INNER JOIN '. GROUP_ACCESS_TABLE .' AS ga
     3861    ON ug.group_id = ga.group_id
     3862  '. $cat_filter .'
     3863;';
     3864  $result = pwg_query($query);
     3865 
     3866  while ($row = pwg_db_fetch_assoc($result))
     3867  {
     3868    if (!isset($perms[ $row['cat_id'] ]))
     3869    {
     3870      $perms[ $row['cat_id'] ]['id'] = $row['cat_id'];
     3871    }
     3872    $perms[ $row['cat_id'] ]['users_indirect'][] = $row['user_id'];
     3873  }
     3874 
     3875  // groups
     3876  $query = '
     3877SELECT group_id, cat_id
     3878  FROM '. GROUP_ACCESS_TABLE .'
     3879  '. $cat_filter .'
     3880;';
     3881  $result = pwg_query($query);
     3882 
     3883  while ($row = pwg_db_fetch_assoc($result))
     3884  {
     3885    if (!isset($perms[ $row['cat_id'] ]))
     3886    {
     3887      $perms[ $row['cat_id'] ]['id'] = $row['cat_id'];
     3888    }
     3889    $perms[ $row['cat_id'] ]['groups'][] = $row['group_id'];
     3890  }
     3891 
     3892  // filter by group and user
     3893  foreach ($perms as $cat_id => &$cat)
     3894  {
     3895    if (isset($filters['group_id']))
     3896    {
     3897      if (empty($cat['groups']) or count(array_intersect($cat['groups'], $params['group_id'])) == 0)
     3898      {
     3899        unset($perms[$cat_id]);
     3900        continue;
     3901      }
     3902    }
     3903    if (isset($filters['user_id']))
     3904    {
     3905      if (
     3906        (empty($cat['users_indirect']) or count(array_intersect($cat['users_indirect'], $params['user_id'])) == 0)
     3907        and (empty($cat['users']) or count(array_intersect($cat['users'], $params['user_id'])) == 0)
     3908      ) {
     3909        unset($perms[$cat_id]);
     3910        continue;
     3911      }
     3912    }
     3913   
     3914    $cat['groups'] = !empty($cat['groups']) ? array_unique($cat['groups']) : array();
     3915    $cat['users'] = !empty($cat['users']) ? array_unique($cat['users']) : array();
     3916    $cat['users_indirect'] = !empty($cat['users_indirect']) ? array_unique($cat['users_indirect']) : array();
     3917  }
     3918  unset($cat);
     3919
     3920  return array('categories' => new PwgNamedArray(array_values($perms), 'category', array('id')));
     3921}
     3922
     3923/**
     3924 * API method
     3925 * Add permissions
     3926 * @param mixed[] $params
     3927 *    @option int[] cat_id
     3928 *    @option int[] group_id (optional)
     3929 *    @option int[] user_id (optional)
     3930 *    @option bool recursive
     3931 */
     3932function ws_permissions_add($params, &$service)
     3933{
     3934  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
     3935 
     3936  if (!empty($params['group_id']))
     3937  {
     3938    $cat_ids = get_uppercat_ids($params['cat_id']);
     3939    if ($params['recursive'])
     3940    {
     3941      $cat_ids = array_merge($cat_ids, get_subcat_ids($params['cat_id']));
     3942    }
     3943   
     3944    $query = '
     3945SELECT id
     3946  FROM '.CATEGORIES_TABLE.'
     3947  WHERE id IN ('.implode(',', $cat_ids).')
     3948    AND status = \'private\'
     3949;';
     3950    $private_cats = array_from_query($query, 'id');
     3951   
     3952    $inserts = array();
     3953    foreach ($private_cats as $cat_id)
     3954    {
     3955      foreach ($params['group_id'] as $group_id)
     3956      {
     3957        $inserts[] = array(
     3958          'group_id' => $group_id,
     3959          'cat_id' => $cat_id
     3960          );
     3961      }
     3962    }
     3963   
     3964    mass_inserts(
     3965      GROUP_ACCESS_TABLE,
     3966      array('group_id','cat_id'),
     3967      $inserts,
     3968      array('ignore'=>true)
     3969      );
     3970  }
     3971 
     3972  if (!empty($params['user_id']))
     3973  {
     3974    if ($params['recursive']) $_POST['apply_on_sub'] = true;
     3975    add_permission_on_category($params['cat_id'], $params['user_id']);
     3976  }
     3977 
     3978  return $service->invoke('pwg.permissions.getList', array('cat_id'=>$params['cat_id']));
     3979}
     3980
     3981/**
     3982 * API method
     3983 * Removes permissions
     3984 * @param mixed[] $params
     3985 *    @option int[] cat_id
     3986 *    @option int[] group_id (optional)
     3987 *    @option int[] user_id (optional)
     3988 */
     3989function ws_permissions_remove($params, &$service)
     3990{
     3991  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
     3992 
     3993  $cat_ids = get_subcat_ids($params['cat_id']);
     3994 
     3995  if (!empty($params['group_id']))
     3996  {
     3997    $query = '
     3998DELETE
     3999  FROM '. GROUP_ACCESS_TABLE .'
     4000  WHERE group_id IN ('. implode(',', $params['group_id']).')
     4001    AND cat_id IN ('. implode(',', $cat_ids).')
     4002;';
     4003    pwg_query($query);
     4004  }
     4005 
     4006  if (!empty($params['user_id']))
     4007  {
     4008    $query = '
     4009DELETE
     4010  FROM '. USER_ACCESS_TABLE .'
     4011  WHERE user_id IN ('. implode(',', $params['user_id']) .')
     4012    AND cat_id IN ('. implode(',', $cat_ids) .')
     4013;';
     4014    pwg_query($query);
     4015  }
     4016 
     4017  return $service->invoke('pwg.permissions.getList', array('cat_id'=>$params['cat_id']));
     4018}
     4019
    38144020?>
  • trunk/ws.php

    r25237 r25245  
    883883      array('admin_only'=>true, 'post_only'=>true)
    884884    );
     885   
     886  $service->addMethod(
     887      'pwg.permissions.getList',
     888      'ws_permissions_getList',
     889      array(
     890        'cat_id' =>     array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     891                              'type'=>WS_TYPE_ID),
     892        'group_id' =>   array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     893                              'type'=>WS_TYPE_ID),
     894        'user_id' =>    array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     895                              'type'=>WS_TYPE_ID),
     896        ),
     897      '<b>Admin only.</b> Returns permissions: user ids and group ids having access to each album ; this list can be filterd with "cat_id".
     898<br>If "user_id" OR "group_id" is provided it returns a list of album ids the user or group has access to.
     899<br>Provide only on parameter!',
     900      null,
     901      array('admin_only'=>true)
     902    );
     903   
     904  $service->addMethod(
     905      'pwg.permissions.add',
     906      'ws_permissions_add',
     907      array(
     908        'cat_id' =>     array('flags'=>WS_PARAM_FORCE_ARRAY,
     909                              'type'=>WS_TYPE_ID),
     910        'group_id' =>   array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     911                              'type'=>WS_TYPE_ID),
     912        'user_id' =>    array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     913                              'type'=>WS_TYPE_ID),
     914        'recursive' =>  array('default'=>false,
     915                              'type'=>WS_TYPE_BOOL),
     916        ),
     917      '<b>Admin only.</b> Adds permissions to an album.',
     918      null,
     919      array('admin_only'=>true)
     920    );
     921   
     922  $service->addMethod(
     923      'pwg.permissions.remove',
     924      'ws_permissions_remove',
     925      array(
     926        'cat_id' =>   array('flags'=>WS_PARAM_FORCE_ARRAY,
     927                            'type'=>WS_TYPE_ID),
     928        'group_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     929                            'type'=>WS_TYPE_ID),
     930        'user_id' =>  array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
     931                            'type'=>WS_TYPE_ID),
     932        ),
     933      '<b>Admin & POST only.</b> Removes permissions from an album.',
     934      null,
     935      array('admin_only'=>true, 'post_only'=>true)
     936    );
    885937}
    886938
Note: See TracChangeset for help on using the changeset viewer.