$line) {
if (strpos($line, "#HttpOnly_") === 0) {
$lines[$i] = substr($line, strlen("#HttpOnly_"));
}
}
$contents = implode("\n", $lines);
file_put_contents($cookieFile, $contents);
}
function curl_request($method, $url, $cookieFile = false, $params = array()) {
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true
);
if ($cookieFile) {
$options[CURLOPT_COOKIEFILE] = $cookieFile;
$options[CURLOPT_COOKIEJAR] = $cookieFile;
}
array_walk($params, function(&$value, $key) { $value = $key . '=' . $value; });
if ($params && strtolower($method) == 'post') {
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = implode("&", $params);
}
else if ($params) { /* assuming default mehtod: GET */
$options[CURLOPT_URL] .= '?' . implode('&', $params);
}
curl_setopt_array($ch, $options);
$output = curl_exec($ch);
curl_close($ch);
if ($cookieFile) {
curl_fixcookie($cookieFile);
}
return $output;
}
function get_address($db, $room) {
return $db->querySingle('SELECT * FROM rooms WHERE id = "' . $db->escapeString($room). '";', true);
}
function set_address($db, $room, $address) {
$db->exec('INSERT OR REPLACE INTO rooms VALUES (
"' . $db->escapeString($room) . '",
"' . $db->escapeString(@$address['address']) . '",
"' . $db->escapeString(@$address['cluster']) . '",
"' . $db->escapeString(@$address['building']) . '",
"' . $db->escapeString(@$address['building_no']) . '",
"' . $db->escapeString(@$address['room']) . '",
"' . $db->escapeString(@$address['room_no']) . '",
"' . $db->escapeString(@$address['floor']) . '"
);');
}
function crawl_address($room) {
global $baseUrl, $roomPath;
$matches = array();
$response = curl_request('GET', $baseUrl . $roomPath . '?room=' . urlencode($room));
$infos = array(
'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('/
' . $pattern . '<\/td> | ([^<]*)<\/td>/', $response, $match)) {
$matches[$index] = preg_replace('/[ ]{2,}/sm', ' ', utf8_encode($match[1]));
}
}
return (count($matches)) ? $matches : false;
}
function error() {
global $scriptUrl;
header("HTTP/1.0 500 Internal Server Error");
echo '
Sorry an error occured! Check your credentials and try again!
';
die();
}
/* Code */
if (!empty($_GET['hash'])) {
$cipher = base64_decode($_GET['hash']);
if (strpos($cipher, ':')) {
list($matrnr, $passwd) = explode(':', $cipher);
}
}
else if (!empty($_GET['u']) && !empty($_GET['p'])) {
$matrnr = $_GET['u'];
$passwd = $_GET['p'];
}
if (isset($matrnr) && isset($passwd)) {
/* perform login to get session cookie */
$cookieFile = tempnam(sys_get_temp_dir(), 'campus_');
/* open database */
$db = new SQLite3('cocal.db', SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
/* check schema */
$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);
$loginParams = array(
'login' => urlencode('> Login'),
'p' => urlencode($passwd),
'u' => urlencode($matrnr)
);
curl_request('POST', $baseUrl . $loginPath, $cookieFile, $loginParams);
/* request calendar */
$calParams = array(
'startdt' => strftime('%d.%m.%Y', time() - 7*24*60*60), /* eine Woche Vergangenheit */
'enddt' => strftime('%d.%m.%Y', time() + 6*31*24*60*60) /* halbes Jahr ZUukunft */
);
$response = curl_request('GET', $baseUrl . $calPath, $cookieFile, $calParams);
/* filter some changes */
list($headers, $body) = explode("\r\n\r\n", $response, 2);
if (substr($body, 0, strlen("BEGIN:VCALENDAR")) != "BEGIN:VCALENDAR") {
error();
}
/* header pass through */
$headers = array_slice(explode("\r\n", $headers), 1);
foreach ($headers as $header) {
list($key, $value) = explode(": ", $header);
switch($key) {
case 'Content-Disposition':
$value = 'attachment; filename=campus_office_' . $matrnr . '.ics';
break;
case 'Content-Type':
$value .= '; charset=utf-8';
break;
}
if ($key != 'Content-Length') { // ignore old length
header($key . ': ' . $value);
}
}
$address = array();
$lines = explode("\r\n", $body);
foreach ($lines as $line) {
if ($line) {
list($key, $value) = explode(":", $line);
switch ($key) {
case 'END':
if ($value == 'VEVENT') flush();
$address = array();
break;
case 'LOCATION':
$matches = array();
if (preg_match('/^([0-9]+\|[0-9]+) /', $value, $matches)) {
$room = $matches[1];
$address = get_address($db, $room);
if (empty($address)) {
$address = crawl_address($room);
set_address($db, $room, $address);
}
if (isset($address['address'])) {
$value = $address['address'] . ', Aachen';
}
}
break;
case 'DESCRIPTION':
$additional = $value;
$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;
}
echo $key . ':' . trim($value);
}
echo "\r\n";
}
/* cleanup */
unlink($cookieFile);
$db->close();
}
else {
echo '';
?>
/dev/nulll - CampusOffice to Google Sync
|