SiteMap.inc
5.79 KB
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
/**
* $Id$
*
* Maintains (page, access) access map, as well as (section, page) map.
*
* @version $Revision$
* @author michael@jamwarehouse.com
* @package dms
*/
class SiteMap {
/**
* The underlying site map storage array
*/
var $siteMapArray;
/**
* Constructs a new SiteMap, initialising the array.
*/
function SiteMap() {
$this->siteMapArray = array();
}
/**
* Adds a site page mapping entry.
*
* @param $action the controller action
* @param $page the corresponding page for this action
* @param $sectionName the section this page falls under
* @param $groupName the user group with access to this page
*/
function addPage($action, $page, $sectionName, $groupName) {
// add to map
$this->siteMapArray[$sectionName][$groupName][$action] = $page;
}
/**
* Returns the page mapped to the (action, groupName) pair.
*
* @param $action the action to lookup pages for
* @param $userID the user requesting the action
* @return string the page to redirect to, or false if the user doesn't have access to the page
*/
function getPage($action, $userID) {
global $default;
$groupIDs = array();
// if there is no session (ie. requesting login page)
// then userID will be "" or unset or something
if (!$userID) {
// no session, so set groupID to Anonymous group
$groupIDs[] = lookupID($default->owl_groups_table, "name", "Anonymous");
} else {
// lookup the groups this user is in
$groupIDs = lookupGroupIDs($userID);
}
$default->log->debug("Sitemap::getPage function start; action=$action; userID=$userID; groupIDs=" . arrayToString($groupIDs));
// for each section
foreach ($this->siteMapArray as $section => $valArr) {
$default->log->debug("Sitemap::getPage section=$section");
// for each group, page array combination
foreach ($valArr as $requiredGroupName => $pageArr) {
// lookup the id of the group with access to this page
$reqGrpID = lookupID($default->owl_groups_table, "name", "$requiredGroupName");
$default->log->debug("Sitemap::getPage requiredGroupName=$requiredGroupName; id=$reqGrpID");
// now loop through pages until we find the right one
foreach ($pageArr as $ackshin => $page) {
if ($ackshin == $action) {
// FIXME: this won't work once we have lots of groups will it??
// we're assuming that the default groups will be created in the right
// order, so that groups with sys and unit access have lower ids than
// the required ones!
// now check if we have the right group access by
// looping through the groupID array and returning the page
// if the current groupID <= $reqGrpID
for ($i = 0; $i<count($groupIDs); $i++) {
$default->log->debug("Sitemap::getPage current groupid=" . $groupIDs[$i] . "; reqGrpID=$reqGrpID");
if ($groupIDs[$i] <= $reqGrpID) {
return $page;
}
}
}
}
}
}
// if the function hasn't returned already then the specified
// userGroup does not have access to the action
$default->log->info("Sitemap::getPage access denied for ($action, $userID)");
return false;
}
/**
* Returns the pages in the specified section accessible to the
* specified userClass.
*
* @param $sectionName the section to retrieve pages for
* @param $userID the user class to return pages for
* @return array the actions for the specified section
*/
function getSection($sectionName, $userID) {
// check if the section exists
if (is_array($this->siteMapArray[$sectionName])) {
// initialise result array
$results = array();
// need to loop through all (groupName, page) arrays in this section
foreach ($this->siteMapArray[$sectionName] as $requiredGroupName => $pages) {
// lookup groupID for requiredGroupName
$reqGrpID = lookupID($default->owl_groups_table, "name", "$requiredGroupName");
// lookup groupIDs for the user
$groupIDs = lookupGroupIDs($userID);
// loop through the user's groups and check against the requiredGroup
for ($i = 0; $i<count($groupIDs); $i++) {
$default->log->debug("getPage current groupid=" . $groupIDs[$i] . "; reqGrpID=$reqGrpID");
if ($groupIDs[$i] <= $reqGrpID) {
// add this array to the resultset array
$results = array_merge($results, $this->siteMapArray[$sectionName][$uc]);
}
}
}
// now check if we have anything in the results array before returning it
if (count($results) > 0) {
return $results;
} else {
return false;
}
} else {
// supplied section not in sitemap
// TODO: internal error code?
$_SESSION["errorMessage"] = "$sectionName not in SiteMap!";
return false;
}
}
/**
* Prints the current site map
*/
function printMap() {
return arrayToString($this->siteMapArray);
}
}
?>