9a2bf9c399c52cf347aa94230986c7033378723e
[iserv-mod-room-reservation.git] / includes / mod_roomReservationConfig.inc
1 <?php
2 /**
3 * @file mod_roomReservationConfig.inc
4 * Handling of the configuration file
5 * @author Roland Hieber (roland.hieber@wilhelm-gym.net)
6 * @date 10.01.2008
7 *
8 * Copyright © 2007 Roland Hieber
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 * THE SOFTWARE.
27 */
28
29 require_once("sec/secure.inc");
30 require_once("mod_room-reservation/functions.inc");
31 require_once("mod_room-reservation/mod_roomReservationTimeslice.inc");
32
33 /**
34 * Determines if a privilege has been assigned
35 * @param $sPriv (string) Privilege to test
36 * @return bool
37 */
38 function rrPrivilegeAssigned($sPriv) {
39 $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1;",
40 $sPriv);
41 return pg_num_rows($h) > 0;
42 }
43
44 /**
45 * Retrieve all groups that have a privilege assigned
46 * @param $strPriv (string) Privilege to test
47 * @return array
48 */
49 function rrPrivilegedGroups($strPriv) {
50 $aReturn = array();
51 $h = db_query("SELECT act FROM privileges_assign WHERE privilege = $1 ".
52 "ORDER BY act;", $strPriv);
53 if(pg_num_rows($h) > 0) {
54 while($a = pg_fetch_array($h)) {
55 $aReturn[] = $a["act"];
56 }
57 }
58 return $aReturn;
59 }
60
61 /**
62 * User-defined compare function to compare timeslices
63 * @param $oTs1 (mod_roomReservationTimeslice)
64 * @param $oTs2 (mod_roomReservationTimeslice)
65 * @return (int) <tt>-1</tt> if $oTs1 begins before $oTs2,
66 * <tt>0</tt> if the $oTs1 and $oTs2 have the same beginning,
67 * <tt>1</tt> if $oTs1 begins after $oTs2.
68 */
69 function rrConfigSortTimeslices(mod_roomReservationTimeslice $oTs1,
70 mod_roomReservationTimeslice $oTs2) {
71 if($oTs1->getBegin() == $oTs2->getBegin()) {
72 return 0;
73 } else {
74 return ($oTs1->getBegin() > $oTs2->getBegin()) ? 1 : -1;
75 }
76 }
77
78 define("MOD_ROOM_RESERVATION_CONFIGFILE_HEADER", "<?php
79 /**
80 * configuration file for package iserv-room-reservation
81 * This file is written by the configuration script. Do not change it manually.
82 */\n");
83
84 /*****************************************************************************/
85 /**
86 * Handling of the configuration file
87 * @todo document
88 */
89 class mod_roomReservationConfig {
90
91 /** (array of rmTimeslice's) Timeslices */
92 protected $aoTimeslices;
93 /** (bool) Determine if the weekend is shown */
94 protected $bShowWeekend;
95 /** (bool) Determine if the strings "1. lesson", "2. lesson" etc are shown */
96 protected $bShowLessons;
97 /** (array of strings) error messages */
98 protected $asMessages;
99
100 /***************************************************************************/
101 /**
102 * @name Constructor
103 * @{
104 * Constructor.
105 * @return mod_roomReservationConfig
106 */
107 public function __construct() {
108 $this->flushTimeslices();
109 $this->setShowWeekend(false);
110 $this->setShowLessons(true);
111 $this->asMessages = array();
112
113 $this->readConfig();
114 }
115
116 /**
117 * **************************************************************************
118 * @}
119 * @name Access to attributes
120 * @{
121 */
122
123 /**
124 * Add a timeslice. A check is done that the timeslices do not overlap, and
125 * in this case, an Exception is thrown.
126 * @param $oTs (mod_roomReservationTimeslice)
127 * @throws Exception
128 * @return void
129 */
130 public function addTimeslice(mod_roomReservationTimeslice $oTs) {
131 // Check for overlapping timeslices
132 foreach($this->aoTimeslices as $oOldTs) {
133 if(($oOldTs->getBegin() < $oTs->getEnd() and
134 $oOldTs->getEnd() > $oTs->getBegin())) {
135 throw new Exception(
136 MOD_ROOM_RESERVATION_ERROR_CONFIG_OVERLAPPING_TIMESLICE);
137 }
138 }
139 $this->aoTimeslices[] = $oTs;
140 usort($this->aoTimeslices, "rrConfigSortTimeslices");
141 return;
142 }
143
144 /**
145 * Delete a timeslice
146 * @param $oTs (mod_roomReservationTimeslice) the timeslice to delete. If
147 * the timeslice is not found, an Exception is thrown.
148 * @throws Exception
149 * @return void
150 */
151 public function deleteTimeslice(mod_roomReservationTimeslice $oTs) {
152 for($i = 0; $i < count($this->aoTimeslices); $i++) {
153 if($this->aoTimeslices[$i]->getBegin() == $oTs->getBegin() and
154 $this->aoTimeslices[$i]->getEnd() == $oTs->getEnd()) {
155 // use array_splice because it renumbers the keys
156 array_splice($this->aoTimeslices, $i, 1);
157 return;
158 }
159 }
160 throw new Exception(MOD_ROOM_RESERVATION_ERROR_CONFIG_NO_SUCH_TIMESLICE);
161 }
162
163 /**
164 * Delete all timeslices.
165 * @return void
166 */
167 public function flushTimeslices() { $this->aoTimeslices = array(); }
168
169 /**
170 * Show or hide the weekend
171 * @param $b (bool)
172 */
173 public function setShowWeekend($b) { $this->bShowWeekend = ($b == true); }
174
175 /**
176 * Show or hide the lesson strings in the booking table
177 * @param $b (bool)
178 */
179 public function setShowLessons($b) { $this->bShowLessons = ($b == true); }
180
181 /**
182 * Add a message to the internal array of (error) messages
183 * @param $sMessage (string)
184 */
185 public function addMessage($sMessage) {
186 array_merge($this->asMessages, array($sMessage));
187 }
188
189 /**
190 * Get all timeslices in chronological order
191 * @return array of rmTimeslice
192 */
193 public function getTimeslices() { return $this->aoTimeslices; }
194
195 /**
196 * Return the starting times of every timeslice
197 * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
198 * current locale
199 * <tt>false</tt>: return just the timestamps
200 * @return array
201 */
202 public function getTimesliceBeginnings($bFormat = false) {
203 $aot = $this->getTimeslices();
204 $aRet = array();
205 foreach($aot as $ao) {
206 $aRet[] = $bFormat ? gmstrftime(_("%#I:%M %p"), $ao->getBegin()) :
207 $ao->getBegin();
208 }
209 return $aRet;
210 }
211
212 /**
213 * Return the ending times of every timeslice
214 * @param $bFormat (bool) <tt>true</tt>: Format the times according to the
215 * current locale
216 * <tt>false</tt>: return just the timestamps
217 * @return array
218 */
219 public function getTimesliceEndings($bFormat = false) {
220 $aot = $this->getTimeslices();
221 $aRet = array();
222 foreach($aot as $ao) {
223 $aRet[] = $bFormat ? gmstrftime(_("%#I:%M %p"), $ao->getEnd()) :
224 $ao->getEnd();
225 }
226 return $aRet;
227 }
228
229 /**
230 * Get a timeslice
231 * @param $n (int) index of the timeslice in the array
232 * @return rmTimeslice
233 */
234 public function getTimeslice($n) { return $this->aoTimeslices[$n]; }
235
236 /**
237 * Determine if the weekend is shown
238 * @return bool
239 */
240 public function isShowWeekend() { return ($this->bShowWeekend == true); }
241
242 /**
243 * Determine if the lesson strings in the booking table are shown
244 * @return bool
245 */
246 public function isShowLessons() { return ($this->bShowLessons == true); }
247
248 /**
249 * Determine if the current user has admin rights. This function tests
250 * if the user is in a group which has the privilege of admin rights.
251 * @todo test
252 * @return bool
253 */
254 public function userIsAdmin() {
255 return secure_privilege("mod_roomreservation_admin");
256 }
257
258 /**
259 * Determine if the current user can book rooms. This function tests
260 * if the user is in a group which has the privilege to book rooms.
261 * If no group has this privilege, all users can book.
262 * @todo test
263 * @return bool
264 */
265 public function userCanBook() {
266 if(!rrPrivilegeAssigned("mod_roomreservation_book")) {
267 // If the privilege is not assigned to any group, all users can book
268 return true;
269 } else {
270 // If user is admin, it makes sense that he can book rooms ;-)
271 return secure_privilege("mod_roomreservation_book") ||
272 secure_privilege("mod_roomreservation_admin");
273 }
274 }
275
276 /**
277 * Determine if the current user can view bookings. This function tests
278 * if the user is in a group which has been configured as a group who
279 * can view bookings. If no groups are configured, any user can view the
280 * bookings table.
281 * @todo test
282 * @return bool
283 */
284 public function userCanView() {
285 if(!rrPrivilegeAssigned("mod_roomreservation_view")) {
286 // If the privilege is not assigned to any group, all users can view
287 return true;
288 } else {
289 // If user is admin or can book, it makes sense that he can view bookings
290 return secure_privilege("mod_roomreservation_admin") ||
291 secure_privilege("mod_roomreservation_book") ||
292 secure_privilege("mod_roomreservation_view");
293 }
294 }
295
296 /**
297 * Get the messages that have been produced
298 * @return string
299 */
300 public function getMessages() {
301 return join("\n", $this->asMessages);
302 }
303
304 /***************************************************************************/
305 /**
306 * @}
307 * @name Operations
308 * @{
309 */
310
311 /**
312 * Write the current state of this instance to the config file.
313 * @throws IOException
314 * @return bool
315 */
316 public function writeConfig() {
317 // Open config file
318 $hFile = fopen("mod_room-reservation/config.inc", "w", true);
319 if(!is_resource($hFile)) {
320 throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
321 return false;
322 }
323 // Try to lock file repeatedly
324 for($n = 0; !flock($hFile, LOCK_EX); $n++) {
325 if($n > 10) {
326 throw new IOException(MOD_ROOM_RESERVATION_ERROR_OPEN_FILE);
327 return false; // Give up
328 } else {
329 sleep(0.2); // Retry after 100 ms
330 }
331 }
332
333 // Create text for config file
334 $strFile = MOD_ROOM_RESERVATION_CONFIGFILE_HEADER;
335
336 // Timeslices
337 $strFile .= "\$this->flushTimeslices();\n";
338 foreach($this->getTimeslices() as $oTs) {
339 $strFile .= sprintf("\$this->addTimeslice(new ".
340 "mod_roomReservationTimeslice(%d, %d));\n", $oTs->getBegin(),
341 $oTs->getEnd());
342 }
343
344 // Show weekend
345 $strFile .= sprintf("\$this->setShowWeekend(%s);\n",
346 $this->isShowWeekend() ? "true" : "false");
347
348 // Show lessons
349 $strFile .= sprintf("\$this->setShowLessons(%s);\n",
350 $this->isShowLessons() ? "true" : "false");
351
352 $strFile .= "?>";
353
354 // Write to config file and unlock it
355 if(fwrite($hFile, $strFile) == false) {
356 throw new IOException(MOD_ROOM_RESERVATION_ERROR_WRITE_FILE);
357 return false;
358 }
359 if(!flock($hFile, LOCK_UN)) {
360 throw new IOException(MOD_ROOM_RESERVATION_ERROR_UNLOCK_FILE);
361 return false;
362 }
363
364 rrInsertLog("Konfiguration verändert");
365 return true;
366 }
367
368 /**
369 * Read configuration from file. Returns <tt>false</tt> if an error occured,
370 * in this case getMessages() contains error messages.
371 * @return bool
372 */
373 public function readConfig() {
374 global $g_rmCfg;
375 try {
376 require("mod_room-reservation/config.inc");
377 } catch(Exception $e) {
378 $this->addMessage($e->getMessage());
379 }
380 }
381
382 /** @} */
383 }
384 ?>
This page took 0.072754 seconds and 3 git commands to generate.