Improve text message when session is expired
[infodrom/hallinta] / lib / general.php
1 <?php
2
3 require_once('db.php');
4
5 function passwd($login,$pass)
6 {
7   return md5(md5($pass).$login);
8 }
9
10 function format_ajax($data)
11 {
12   header('Content-type: application/json; charset=UTF-8');
13   echo json_encode($data);
14   exit;
15 }
16
17 function format_xml($errmsg)
18 {
19   header("Cache-Control: no-cache");
20   header("Pragma: no-cache");
21   header("Expires: ".gmdate("D, d M Y H:i:s",time()+(-1*60))." GMT");
22   header("Content-type: text/xml");
23
24   echo "<?xml version='1.0' encoding='UTF-8'?".">\n";
25   echo "\n<ajax-response><response type='object'>";
26   echo "\n<error>";
27   echo "\n".htmlspecialchars($errmsg);
28   echo "\n</error>";
29   echo "\n</response></ajax-response>";
30   exit;
31 }
32
33 function check_permissions($name)
34 {
35   global $db;
36
37   $parts = explode('__', $name);
38   $form = $parts[0] . '|' . $parts[1];
39
40   $sql = sprintf("SELECT count(*) AS count FROM sys_mask "
41                  . "JOIN sys_menu ON sys_mask.menu = sys_menu.id "
42                  . "JOIN sys_group_mask ON sys_mask.id = sys_group_mask.mask "
43                  . "WHERE sys_group_mask.gid = %d AND fname = %s",
44                  $_SESSION['sys']['group'], $db->quote($form));
45
46   $sth = $db->query($sql);
47
48   if ($sth === false) {
49     error_log('Unauthorised access to ' . $form);
50     return false;
51   }
52
53   $row = $sth->fetch();
54   if ($row === false) {
55     error_log('Unauthorised access to ' . $form);
56     return false;
57   }
58
59   if ($row['count'] == 0) {
60     error_log('Unauthorised access to ' . $form);
61     return false;
62   }
63
64   return true;
65 }
66
67 function check_session()
68 {
69   /* table data */
70   if (substr($_SERVER["SCRIPT_FILENAME"],-17) == '/ricoXMLquery.php' &&
71       !empty($_GET['id']) && substr($_GET['id'],0,5) == 'grid_') {
72     if (check_permissions(substr($_GET['id'],5)))
73       return true;
74     else {
75       if (empty($_SESSION['sys']['login']))
76         format_xml("No permission to access data.\nNo active session found.\nYou may need to re-login.");
77       else
78         format_xml('No permission to access data');
79     }
80   }
81
82   /* table connections */
83   if (substr($_SERVER["SCRIPT_FILENAME"],-25) == '/ricoUpdateConnection.php' &&
84       !empty($_GET['id']) && substr($_GET['id'],0,5) == 'grid_') {
85     if (check_permissions(substr($_GET['id'],5)))
86       return true;
87     else
88       format_ajax(array('error' => 'No permission to access data'));
89   }
90
91   /* ajax calls */
92   if (substr($_SERVER["SCRIPT_FILENAME"],-9) == '/ajax.php' &&
93       !empty($_POST['source'])) {
94     if (check_permissions($_POST['source']))
95       return true;
96     else {
97       if (empty($_SESSION['sys']['login']))
98         format_ajax(array('error' => "No permission to access data.\nNo active session found.\nYou need to re-login.",
99                           'logout' => true));
100       else
101         format_ajax(array('error' => 'No permission to access data'));
102     }
103   }
104
105   if (!empty($_SESSION['sys']['login']) && !empty($_GET['logout'])) {
106     session_destroy();
107     header('Location: ./?login=true');
108     exit();
109   }
110
111   if (substr($_SERVER["SCRIPT_FILENAME"],-10) == '/index.php' &&
112       !empty($_POST['login']) && !empty($_POST['passwd'])) {
113     require_once('lib/login.php');
114     if (check_passwd()) {
115       header('Location: ./');
116       exit();
117     }
118   }
119
120   if (empty($_SESSION['sys']['login']) && empty($_GET['login'])) {
121     header('Location: ./?login=true');
122     exit();
123   }
124
125   /* regular mask */
126   if (!empty($_GET['mask'])) {
127     if (check_permissions($_GET['mask']))
128       return true;
129     else {
130       header('Location: ./');
131       exit();
132     }
133   }
134
135   return true;
136 }
137
138 function sanitise_filename($file)
139 {
140   return str_replace('./','x',$file);
141 }
142
143 function load_mask($name)
144 {
145   global $mask;
146   global $jscode;
147   global $style;
148
149   $name = sanitise_filename($name);
150   list($module,$fname) = explode('__', $name);
151   $_SESSION['module'] = $module;
152
153   $file = $_SESSION['sys']['basedir'] . 'masks/' . $module . '/' . $fname . '.php';
154
155   if (!file_exists($file))
156     return false;
157
158   include_once($file);
159
160   return true;
161 }
162
163 function load_js($jsfiles, $jscode)
164 {
165   $ret = '';
166   foreach ($jsfiles as $file)
167     $ret .= sprintf('<script type="text/javascript" src="%s"></script>'."\n", $file);
168
169   if (!empty($jscode))
170     $ret .= sprintf('<script type="text/javascript">'."\n%s\n</script>\n", implode("\n",$jscode));
171
172   return $ret;
173 }
174
175 function load_style($style)
176 {
177   $ret = '';
178   if (!empty($style))
179     $ret .= sprintf('<style type="text/css">'."\n%s\n</style>\n", implode("\n",$style));
180
181   return $ret;
182 }
183
184 function process()
185 {
186   if (!empty($_GET['login'])) {
187     require_once('lib/login.php');
188     return mask_login();
189   }
190
191   if (!empty($_GET['mask'])) {
192     require_once('lib/mask.php');
193     return mask($_GET['mask']);
194   }
195
196   $ret = '';
197   $fname = $_SESSION['sys']['basedir'] . 'data/misc/start.html';
198   if (file_exists($fname))
199     return file_get_contents($fname);
200   
201   return $ret;
202 }
203
204 function debug_log($text)
205 {
206   global $debug_info;
207
208   $debug_info .= '<br>' . $text;
209 }
210
211 function debug_info()
212 {
213   global $jsfiles;
214   global $debug_info;
215
216   if (DEBUG !== true) return '';
217
218   $jsfiles[] = 'lib/debug_joey.js';
219
220   $html = '<div style="background: #DDD; margin: 5px; padding-left: 4px; border: 1px solid #AAA;clear:both;">';
221   $html .= "\n<pre>\n\$_SESSION = " . var_export($_SESSION,true) . "\n";
222   $html .= "\n\$_COOKIE = " . var_export($_COOKIE,true) . "\n</pre>\n";
223   $html .= $debug_info;
224   $html .= '</div>';
225   return $html;
226 }
227
228 function grid_sql_join($mask)
229 {
230   $ret = '';
231   if (array_key_exists('join', $mask)) {
232     foreach ($mask['join'] as $line) {
233       if (strtolower(substr($line,0,4)) == 'left')
234         $ret .= ' LEFT JOIN ' . substr($line,5);
235       else
236         $ret .= ' JOIN ' . $line;
237     }
238   }
239   return $ret;
240 }
241
242 function grid_lookup_sql($table,$id,$text)
243 {
244   global $db;
245
246   if (empty($_GET['mask'])) return;
247
248   $sql = "SELECT $id,$text FROM $table ORDER BY $text";
249   $sth = $db->query($sql);
250
251   $result = array();
252   while ($row = $sth->fetch())
253     $result[] = sprintf("%d: '%s'", $row[$id], $row[$text]);
254
255   return '{' . implode(', ', $result) . '}';
256 }
257
258 function grid_sql($name, $mask)
259 {
260   $i = 0;
261   $fields = array();
262   foreach ($mask['list'] as $field => $data) {
263     if (array_key_exists('sql', $data))
264       $fields[] = $data['sql'] . ' AS ' . $field;
265     else
266       $fields[] = $field;
267     if (array_key_exists('distinct', $data))
268       $_SESSION['grid_' . $name.'_distinct_'.$i] = $data['distinct'];
269     $i++;
270   }
271
272   $_SESSION['grid_' . $name] = sprintf("SELECT %s FROM %s",
273                                        implode(',', $fields), $mask['table']);
274   if (array_key_exists('join', $mask)) $_SESSION['grid_' . $name] .= grid_sql_join($mask);
275   if (array_key_exists('where', $mask)) $_SESSION['grid_' . $name] .= ' WHERE ' . $mask['where'];
276 }
277
278 ?>