fixed invalid tempdir with sys_get_temp_dir()

included more details of address in description
This commit is contained in:
Steffen Vogel 2012-11-01 17:03:35 +01:00
parent eb7db50ab0
commit 9da19fc186
2 changed files with 80 additions and 53 deletions

Binary file not shown.

View file

@ -7,7 +7,7 @@ $homePath = 'office/default.asp';
$loginPath = 'office/views/campus/redirect.asp'; $loginPath = 'office/views/campus/redirect.asp';
$calPath = 'office/views/calendar/iCalExport.asp'; $calPath = 'office/views/calendar/iCalExport.asp';
$logoutPath = 'office/system/login/logoff.asp'; $logoutPath = 'office/system/login/logoff.asp';
$roomPath = 'rwth/all/room.asp' $roomPath = 'rwth/all/room.asp';
/* Functions */ /* Functions */
function curl_fixcookie($cookieFile) { function curl_fixcookie($cookieFile) {
@ -61,44 +61,47 @@ function curl_request($method, $url, $cookieFile = false, $params = array()) {
} }
function get_address($db, $room) { function get_address($db, $room) {
$result = sqlite_query($db, 'SELECT address FROM rooms WHERE id = "' . sqlite_escape_string($room). '";'); return $db->querySingle('SELECT * FROM rooms WHERE id = "' . $db->escapeString($room). '";', true);
return ($result && sqlite_valid($result)) ? sqlite_fetch_array($result) : false;
} }
function set_address($db, $room, $address) { function set_address($db, $room, $address) {
sqlite_exec($db, 'INSERT OR REPLACE INTO rooms VALUES ( $db->exec('INSERT OR REPLACE INTO rooms VALUES (
"' . sqlite_escape_string($address['id']) . '", "' . $db->escapeString($room) . '",
"' . sqlite_escape_string($address['address']) . '", "' . $db->escapeString(@$address['address']) . '",
"' . sqlite_escape_string($address['cluster']) . '", "' . $db->escapeString(@$address['cluster']) . '",
"' . sqlite_escape_string($address['building']) . '", "' . $db->escapeString(@$address['building']) . '",
"' . sqlite_escape_string($address['building_no']) . '", "' . $db->escapeString(@$address['building_no']) . '",
"' . sqlite_escape_string($address['room']) . '", "' . $db->escapeString(@$address['room']) . '",
"' . sqlite_escape_string($address['room_no']) . '", "' . $db->escapeString(@$address['room_no']) . '",
"' . sqlite_escape_string($address['floor']) . '" "' . $db->escapeString(@$address['floor']) . '"
);', $error); );');
} }
function crawl_address($room) { function crawl_address($room) {
$response = curl_request('GET', $basePath . $roomPath . '?room=' . urlencode($room)); global $baseUrl, $roomPath;
$matches = array(); $matches = array();
preg_match("/<td class=\"default\">H.rsaalgruppe<\/td><td class=\"default\">(?P<cluster>[^<]*)<\/td>/", $response, $matches); $response = curl_request('GET', $baseUrl . $roomPath . '?room=' . urlencode($room));
preg_match("/<td class=\"default\">Geb.udeanschrift<\/td><td class=\"default\">(?P<address>[^<]*)<\/td>/", $response, $matches);
preg_match("/<td class=\"default\">Geb.udebezeichnung<\/td><td class=\"default\">(?P<building>[^<]*)<\/td>/", $response, $matches);
preg_match("/<td class=\"default\">Geb.udenummer<\/td><td class=\"default\">(?P<building_no>[^<]*)<\/td>/", $response, $matches);
preg_match("/<td class=\"default\">Raumname<\/td><td class=\"default\">(?P<room>[^<]*)<\/td>/", $response, $matches);
preg_match("/<td class=\"default\">Raumnummer<\/td><td class=\"default\">(?P<room_no>[^<]*)<\/td>/", $response, $matches);
preg_match("/<td class=\"default\">Geschoss<\/td><td class=\"default\">(?P<floor>[^<]*)<\/td>/", $response, $matches);
foreach ($matches as $key => $value) { $infos = array(
if (is_numeric($key) unset($matches[$key]); 'cluster' => 'H.rsaalgruppe',
'address' => 'Geb.udeanschrift',
'building' => 'Geb.udebezeichung',
'building_no' => 'Geb.udenummer',
'room' => 'Raumname',
'room_no' => 'Raumnummer',
'floor' => 'Geschoss'
);
foreach ($infos as $index => $pattern) {
$match = array();
if (preg_match('/<td class="default">' . $pattern . '<\/td><td class="default">([^<]*)<\/td>/', $response, $match)) {
$matches[$index] = preg_replace('/[ ]{2,}/sm', ' ', utf8_encode($match[1]));
}
} }
array_walk($matches, function ($value) { return (count($matches)) ? $matches : false;
return preg_replace('/[ ]{2,}/sm', ' ', utf8_encode($value));
});
return (count($matches['address']) ? $matches : false;
} }
function error() { function error() {
@ -135,13 +138,15 @@ else if (!empty($_GET['u']) && !empty($_GET['p'])) {
if (isset($matrnr) && isset($passwd)) { if (isset($matrnr) && isset($passwd)) {
/* perform login to get session cookie */ /* perform login to get session cookie */
$cookieFile = tempnam('/tmp', 'campus_'); $cookieFile = tempnam(sys_get_temp_dir(), 'campus_');
/* open database */ /* open database */
$db = sqlite_open('cocal.db'); $db = new SQLite3('cocal.db', SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
$result = sqlite_query($db, "SELECT name FROM sqlite_master WHERE type='table' AND name='rooms';");
if (!sqlite_valid($result)) { /* check schema */
sqlite_exec($db, 'CREATE TABLE rooms (name VARCHAR(255), address VARCHAR(255));'); $result = $db->querySingle('SELECT name FROM sqlite_master WHERE type="table" AND name="rooms";');
if (!$result) {
$db->exec('create table rooms (id VARCHAR(255) PRIMARY KEY, address VARCHAR(255), cluster VARCHAR(255), building VARCHAR(255), building_no INTEGER, room VARCHAR(255), room_no INTEGER, floor VARCHAR(255));');
} }
curl_request('GET', $baseUrl . $homePath, $cookieFile); curl_request('GET', $baseUrl . $homePath, $cookieFile);
@ -188,7 +193,7 @@ if (isset($matrnr) && isset($passwd)) {
} }
} }
$location = ''; $address = array();
$lines = explode("\r\n", $body); $lines = explode("\r\n", $body);
foreach ($lines as $line) { foreach ($lines as $line) {
if ($line) { if ($line) {
@ -196,38 +201,60 @@ if (isset($matrnr) && isset($passwd)) {
switch ($key) { switch ($key) {
case 'END': case 'END':
if ($value == 'VEVENT') flush(); if ($value == 'VEVENT') flush();
unset($location); $address = array();
break; break;
case 'LOCATION': case 'LOCATION':
$location = $value; $matches = array();
$room = strtok($location, " "); if (preg_match('/^([0-9]+\|[0-9]+) /', $value, $matches)) {
$address = get_address($db, $room); $room = $matches[1];
$address = get_address($db, $room);
if ($address === false) { if (empty($address)) {
$crawled = crawl_address($room); $address = crawl_address($room);
set_address($db, $room, $address); set_address($db, $room, $address);
} }
if ($address) { if (isset($address['address'])) {
$value = $address['address'] . ', Aachen'; $value = $address['address'] . ', Aachen';
}
} }
break; break;
case 'DESCRIPTION': case 'DESCRIPTION':
if ($value) $value .= '\n'; $additional = $value;
$value .= $location; $value = '';
if (@$address['building_no'] && @$address['room_no'])
$value .= '\n' . $address['building_no'] . '|' . $address['room_no'];
if (@$address['room'])
$value .= ' ' . $address['room'];
if (@$address['building'])
$value .= '\n' . 'Gebäude: ' . $address['building'];
if (@$address['floor'])
$value .= '\n' . 'Geschoss: ' . $address['floor'];
if (@$address['cluster'])
$value .= '\n' . 'Campus: ' . preg_replace('/^Campus /', '', $address['cluster']);
if ($additional && $additional != 'Kommentar')
$value .= '\n' . $additional;
$value = preg_replace('/^\\\n/', '', $value);
break; break;
} }
echo $key . ':' . trim($value);
echo $key . ':' . $value;
} }
echo "\r\n"; echo "\r\n";
} }
/* cleanup */ /* cleanup */
unlink($cookieFile); unlink($cookieFile);
sqlite_close($db); $db->close();
} }
else { else {
echo '<?xml version="1.0" ?>'; echo '<?xml version="1.0" ?>';
@ -237,9 +264,9 @@ else {
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<title>/dev/nulll - CampusOffice to Google Sync</title> <title>/dev/nulll - CampusOffice to Google Sync</title>
<script src="jquery-1.7.2.min.js" type="text/javascript"></script> <script src="../jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="scripts.js" type="text/javascript"></script> <script src="../scripts.js" type="text/javascript"></script>
<script src="base64.js" type="text/javascript"></script> <script src="../base64.js" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
function unique(length) { function unique(length) {
var chars = "0123456789abcdefghiklmnopqrstuvwxyz"; var chars = "0123456789abcdefghiklmnopqrstuvwxyz";
@ -283,7 +310,7 @@ else {
}); });
} }
</script> </script>
<link rel="stylesheet" type="text/css" href="style.css"> <link rel="stylesheet" type="text/css" href="../style.css">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="/favicon.png" type="image/png"> <link rel="shortcut icon" href="/favicon.png" type="image/png">
<link rel="icon" href="/favicon.png" type="image/png"> <link rel="icon" href="/favicon.png" type="image/png">