Check permissions when accessing pages
[misc/kostenrechnung] / ajax / ajax.php
1 <?php
2
3 require_once('../init.php');
4
5 function fetch($mask)
6 {
7   $fields = array("to_char(sys_edit,'DD.MM.YYYY HH24:mm') AS sys_edit", 'sys_user');
8   foreach ($mask['edit'] as $field => $info) {
9     if ($info['sql'] === false) continue;
10     if ($info['type'] == 'date')
11       $fields[] = sprintf("to_char(%s,'DD.MM.YYYY') AS %s",
12                           empty($info['sql']) ? $field : $info['sql'],
13                           $field);
14     elseif ($info['type'] != 'passwd')
15       $fields[] = empty($info['sql']) ? $field : $info['sql'] . ' AS ' . $field;
16   }
17
18   $sql = sprintf('SELECT id,%s FROM %s WHERE id = %d',
19                  implode(',', $fields),
20                  $mask['table'], $_POST['id']);
21
22   $sth = pg_query($sql);
23   if ($sth === false) return false;
24
25   $row = pg_fetch_assoc($sth);
26
27   foreach ($mask['edit'] as $field => $info)
28     if ($info['type'] == 'boolean')
29       $row[$field] = $row[$field]?true:false;
30     elseif ($info['type'] == 'passwd')
31       $row[$field] = '';
32     elseif (array_key_exists('format', $info))
33       $row[$field] = sprintf($info['format'], $row[$field]);
34
35   return $row;
36 }
37
38 function details($mask)
39 {
40   if (empty($_POST['id']))
41     return array('error' => 'Missing ID');
42
43   $fields = array();
44   foreach ($mask['details']['list'] as $field => $info) {
45     if ($info['type'] == 'date')
46       $fields[] = sprintf("to_char(%s,'DD.MM.YYYY') AS %s",
47                           empty($info['sql']) ? $field : $info['sql'],
48                           $field);
49     elseif (!array_key_exists('fetch',$info))
50       $fields[] = empty($info['sql']) ? $field : $info['sql'] . ' AS ' . $field;
51   }
52
53   if (count($fields)) {
54     $sql = sprintf('SELECT id,%s FROM %s WHERE id = %d',
55                    implode(',', $fields),
56                    $mask['table'], $_POST['id']);
57
58     $sth = pg_query($sql);
59
60     if (!$sth)
61       return array('error' => pg_last_error(),
62                    'sql' => $sql);
63
64     $row = pg_fetch_assoc($sth);
65   } else {
66     $row = array();
67   }
68
69   foreach ($mask['details']['list'] as $field => $info)
70     if (array_key_exists('format', $info))
71       $row[$field] = sprintf($info['format'], $row[$field]);
72     elseif (array_key_exists('fetch', $info))
73       $row[$field] = $info['fetch']();
74
75   return $row;
76 }
77
78 function format_decimal($value)
79 {
80   $value = str_replace(',','.',$value);
81   return sprintf("%.2f", $value);
82 }
83
84 function save($mask)
85 {
86   if (empty($_POST['id']))
87     return array('error' => 'Missing ID');
88
89   $update = array(sprintf("sys_user = '%s'", pg_escape_string($_SESSION['sys']['login'])),
90                   "sys_edit = now()");
91
92   foreach ($mask['edit'] as $field => $info) {
93     if ($info['required'] === true && empty($_POST[$field]))
94       return array('error' => sprintf('Pflichtfeld %s nicht ausgefüllt', $info['name']),
95                    'errormsg' => 'Pflichtfelder nicht ausgefüllt');
96
97     if ($info['type'] == 'boolean') {
98       $update[] = sprintf("%s=%d", $field, $_POST[$field] == 'on'?1:0);
99     } elseif ($info['type'] == 'number' || $info['type'] == 'hidden' || ($info['type'] == 'select' && $info['options_string'] !== true)) {
100       if (empty($_POST[$field]) && $info['null'] === true)
101         $update[] = sprintf("%s=NULL", $field);
102       else
103         $update[] = sprintf("%s=%d", $field, $_POST[$field]);
104     } elseif ($info['type'] == 'decimal') {
105       if (empty($_POST[$field]) && $info['null'] === true)
106         $update[] = sprintf("%s=NULL", $field);
107       else
108         $update[] = sprintf("%s=%s", $field, format_decimal($_POST[$field]));
109     } elseif ($info['type'] == 'passwd') {
110       if (!empty($_POST[$field]))
111         $update[] = sprintf("%s='%s'", $field, pg_escape_string(passwd($_SESSION['sys']['login'],$_POST[$field])));
112     } else {
113       if (empty($_POST[$field]) && $info['null'] === true)
114         $update[] = sprintf("%s=NULL", $field);
115       else
116         $update[] = sprintf("%s='%s'", $field, pg_escape_string($_POST[$field]));
117     }
118   }
119
120   $sql = sprintf('UPDATE %s SET %s WHERE id = %d',
121                  empty($mask['edit_table']) ? $mask['table'] : $mask['edit_table'],
122                  implode(', ', $update),
123                  intval($_POST['id']));
124
125   $sth = pg_query($sql);
126
127   if ($sth === false) {
128     error_log($sql . ': ' . pg_last_error());
129     return array('error' => pg_last_error(),
130                  'sql' => $sql);
131   }
132
133   return array('status' => true);
134 }
135
136 function insert($mask)
137 {
138   $fields = array('sys_user','sys_edit');
139   $values = array("'".pg_escape_string($_SESSION['sys']['login'])."'", 'now()');
140
141   foreach ($mask['edit'] as $field => $info) {
142     if ($info['required'] === true && empty($_POST[$field]))
143       return array('error' => sprintf('Pflichtfeld %s nicht ausgefüllt', $info['name']),
144                    'errormsg' => 'Pflichtfelder nicht ausgefüllt');
145
146     if ($info['type'] == 'boolean') {
147       $fields[] = $field;
148       $values[] = $_POST[$field] == 'on'?1:0;
149     } elseif ($info['type'] == 'number' || $info['type'] == 'hidden' || ($info['type'] == 'select' && $info['options_string'] !== true)) {
150       $fields[] = $field;
151       if (empty($_POST[$field]) && $info['null'] === true)
152         $values[] = 'NULL';
153       else
154         $values[] = intval($_POST[$field]);
155     } elseif ($info['type'] == 'decimal') {
156       $fields[] = $field;
157       if (empty($_POST[$field]) && $info['null'] === true)
158         $values[] = 'NULL';
159       else
160         $values[] = format_decimal($_POST[$field]);
161     } elseif ($info['type'] == 'passwd') {
162       if (!empty($_POST[$field])) {
163         $fields[] = $field;
164         $values[] = sprintf("'%s'", pg_escape_string(passwd($_SESSION['sys']['login'],$_POST[$field])));
165       }
166     } else {
167       $fields[] = $field;
168       if (empty($_POST[$field]) && $info['null'] === true)
169         $values[] = 'NULL';
170       else
171         $values[] = sprintf("'%s'", pg_escape_string($_POST[$field]));
172     }
173   }
174
175   $sql = sprintf('INSERT INTO %s (%s) VALUES (%s)',
176                  empty($mask['edit_table']) ? $mask['table'] : $mask['edit_table'],
177                  implode(',', $fields),
178                  implode(',', $values));
179
180   $sth = pg_query($sql);
181
182   if ($sth === false) {
183     error_log($sql . ': ' . pg_last_error());
184     return array('error' => pg_last_error(),
185                  'sql' => $sql);
186   }
187
188   return array('status' => true);
189 }
190
191 function delete_or_copy($mask)
192 {
193   if (empty($_POST['id']))
194     return array('error' => 'Missing ID');
195
196   if (!empty($mask['edit_table']))
197     return array('error' => 'Cannot handle deletion for secondary table');
198
199   if (DELETE_COPY === true) {
200     $sql = sprintf("INSERT INTO %s_deleted SELECT * FROM %s WHERE id = %d",
201                    $mask['table'], $mask['table'], $_POST['id']);
202
203     $sth = pg_query($sql);
204
205     if ($sth === false) {
206       error_log($sql . ': ' . pg_last_error());
207       return array('error' => pg_last_error(),
208                    'sql' => $sql);
209     }
210
211     $sql = sprintf("UPDATE %s_deleted SET sys_user='%s',sys_edit=now() WHERE id = %d",
212                    $mask['table'], $_SESSION['sys']['login'], $_POST['id']);
213
214     $sth = pg_query($sql);
215
216     if ($sth === false) {
217       error_log($sql . ': ' . pg_last_error());
218       return array('error' => pg_last_error(),
219                    'sql' => $sql);
220     }
221   }
222
223   $sql = sprintf("DELETE FROM %s WHERE id = %d", $mask['table'], $_POST['id']);
224
225   $sth = pg_query($sql);
226
227   if ($sth === false) {
228     error_log($sql . ': ' . pg_last_error());
229     return array('error' => pg_last_error(),
230                  'sql' => $sql);
231   }
232
233   return array('status' => true);
234 }
235
236 function set_variable($name,$mask)
237 {
238   if (!array_key_exists('variables',$mask))
239     return array('error' => 'Unknown variable ' . htmlspecialchars($_POST['name']));
240
241   if (!array_key_exists($_POST['name'],$mask['variables']))
242     return array('error' => 'Unknown variable ' . htmlspecialchars($_POST['name']));
243
244   $_SESSION[$name . '.' . $_POST['name']] = $_POST['value'];
245
246   if (array_key_exists('postcall',$mask['variables'][$_POST['name']]))
247     $mask['variables'][$_POST['name']]['postcall']();
248
249   return array('status' => true);
250 }
251
252 function get_infos($mask)
253 {
254   if (!array_key_exists('info',$mask))
255     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
256
257   if (!array_key_exists($_POST['name'],$mask['info']))
258     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
259
260   if (!array_key_exists('sql',$mask['info'][$_POST['name']]))
261     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
262
263   $sql = $mask['info'][$_POST['name']]['sql'];
264
265   while (preg_match('/\{([^\}]*)\}/', $sql, $matches))
266     $sql = str_replace('{'.$matches[1].'}', $_POST[$matches[1]], $sql);
267
268   return array('info' => query_db($sql));
269 }
270
271 if (empty($_POST['func']))
272   exit;
273
274 if (empty($_POST['source']))
275   exit;
276
277 connect_db();
278 if (load_mask($_POST['source']) === false) exit;
279
280 $data = array('error' => 'Unknown function');
281
282 if ($_POST['func'] == 'fetch') {
283   $data = fetch($mask);
284 } elseif ($_POST['func'] == 'details') {
285   $data = details($mask);
286 } elseif ($_POST['func'] == 'save') {
287   $data = save($mask);
288 } elseif ($_POST['func'] == 'insert') {
289   $data = insert($mask);
290 } elseif ($_POST['func'] == 'delete') {
291   $data = delete_or_copy($mask);
292 } elseif ($_POST['func'] == 'setvar') {
293   $data = set_variable($_POST['source'],$mask);
294 } elseif ($_POST['func'] == 'info') {
295   $data = get_infos($mask);
296 }
297
298 format_ajax($data);
299
300 ?>