$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
0l

CampusOffice to Google Sync