summaryrefslogtreecommitdiff
path: root/inc/acl_admin.php
blob: f7cd7fbd7d9beb4d7826e4203e0ed86079e624a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
/**
 * $ID is pagename, reads matching lines from $AUTH_ACL,
 * also reads acls from namespace
 * returns multi-array with key=pagename and value=array(user, acl)
 *
 * @author	Frank Schubert <frank@schokilade.de>
 */
function get_acl_config($ID){
  global $AUTH_ACL;
  
  $acl_config=array();
  
  // match exact name
  $matches = preg_grep('/^'.$ID.'\s+.*/',$AUTH_ACL);
  if(count($matches)){
    foreach($matches as $match){
      $match = preg_replace('/#.*$/','',$match); //ignore comments
      $acl   = preg_split('/\s+/',$match);
      //0 is pagename, 1 is user, 2 is acl
      $acl_config["$acl[0]"][]=array($acl[1],$acl[2]);
    }
  }
  
  $specific_found=array();
  // match ns
  if(($ID=getNS($ID)) !== false){
    $matches = preg_grep('/^'.$ID.':\*\s+.*/',$AUTH_ACL);
    if(count($matches)){
      foreach($matches as $match){
	$match = preg_replace('/#.*$/','',$match); //ignore comments
	$acl   = preg_split('/\s+/',$match);
	//0 is pagename, 1 is user, 2 is acl
	$acl_config["$acl[0]"][]=array($acl[1],$acl[2]);
	$specific_found[]=$acl[1];
      }
    }
  }
  
  //include *-config
  $matches = preg_grep('/^\*\s+.*/',$AUTH_ACL);
  if(count($matches)){
    foreach($matches as $match){
      $match = preg_replace('/#.*$/','',$match); //ignore comments
      $acl   = preg_split('/\s+/',$match);
      // only include * for this user if not already found in ns
      if(!in_array($acl[1], $specific_found)){
        //0 is pagename, 1 is user, 2 is acl
        $acl_config["$acl[0]"][]=array($acl[1],$acl[2]);
      }
    }
  }
  
  //sort
  //FIXME: better sort algo: first sort by key, then sort by first value
  krsort($acl_config, SORT_STRING);
  
  return($acl_config);
}

/**
 * adds new acl-entry to conf/acl.auth
 *
 * @author	Frank Schubert <frank@schokilade.de>
 */
function acl_admin_add($acl_scope, $acl_user, $acl_level){
  if($acl_scope === '' || $acl_user === '' || $acl_level === '') { return false; }
  
  $acl_config = join("",file('conf/acl.auth'));
  
  // max level for pagenames is 2
  if(strpos("*", $acl_scope) === false) {
    if($acl_level > 2) { $acl_level = 2; }
  }
  
  $new_acl = "$acl_scope\t$acl_user\t$acl_level\n";
  
  $new_config = $acl_config.$new_acl;
  
  return io_saveFile("conf/acl.auth", $new_config);
}

/**
 * remove acl-entry from conf/acl.auth
 *
 * @author	Frank Schubert <frank@schokilade.de>
 */
function acl_admin_del($acl_scope, $acl_user, $acl_level){
  if($acl_scope === '' || $acl_user === '' || $acl_level === '') { return false; }
  
  $acl_pattern = preg_quote($acl_scope)."\s+".$acl_user."\s+".$acl_level."\n";
  
  $acl_config = file('conf/acl.auth');
  
  // save all non!-matching
  $new_config = preg_grep("/$acl_pattern/", $acl_config, PREG_GREP_INVERT);
  
  return io_saveFile("conf/acl.auth", join("",$new_config));
}

/**
 * change existing acl entries
 *
 * @author	Frank Schubert <frank@schokilade.de>
 */
function acl_admin_change($acl_scope, $acl_user, $acl_level, $acl_checkbox){
  
  $new_level = 0;
  if(is_array($acl_checkbox)) {
    foreach($acl_checkbox as $acl_num => $value){
      if( ($value == "on") && 
          ($acl_num > $new_level)) {
	$new_level = $acl_num;
      }
    }
  }
  
  acl_admin_del($acl_scope, $acl_user, $acl_level);
  acl_admin_add($acl_scope, $acl_user, $new_level);
}
?>