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);
}
?>
|