diff --git a/php/cocal.db b/php/cocal.db new file mode 100644 index 0000000..e49e99b Binary files /dev/null and b/php/cocal.db differ diff --git a/php/cocal.php b/php/cocal.php new file mode 100644 index 0000000..0ef56f2 --- /dev/null +++ b/php/cocal.php @@ -0,0 +1,212 @@ + $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); + + return $output; +} + +function get_address($db, $room) { + $result = sqlite_query($db, 'SELECT address FROM rooms WHERE name = "' . sqlite_escape_string($room). '";'); + return ($result && sqlite_valid($result)) ? sqlite_fetch_string($result) : false; +} + +function set_address($db, $room, $address) { + sqlite_exec($db, 'INSERT INTO rooms VALUES ("' . sqlite_escape_string($room) . '", "' . sqlite_escape_string($address) . '");', $error); +} + +function crawl_address($room) { + $response = curl_request('GET', 'http://www.campus.rwth-aachen.de/rwth/all/room.asp?room=' . urlencode($room)); + + $matches = array(); + $r = preg_match("/Geb.udeanschrift<\/td>([^<]*)<\/td>/", $response, $matches); + + return ($r > 0) ? $matches[1] : false; +} + + +/* Code */ +if (!empty($_GET['p']) && !empty($_GET['u'])) { + /* perform login to get session cookie */ + $cookieFile = tempnam('/tmp', 'campus_'); + + /* open database */ + $db = sqlite_open('cocal.db'); + $result = sqlite_query($db, "SELECT name FROM sqlite_master WHERE type='table' AND name='rooms';"); + if (!sqlite_valid($result)) { + sqlite_exec($db, 'CREATE TABLE rooms (name VARCHAR(255), address VARCHAR(255));'); + } + + curl_request('GET', $baseUrl . $homePath, $cookieFile); + curl_fixcookie($cookieFile); + + $loginParams = array( + 'login' => urlencode('> Login'), + 'p' => urlencode($_GET['p']), + 'u' => urlencode($_GET['u']) + ); + + curl_request('POST', $baseUrl . $loginPath, $cookieFile, $loginParams); + curl_fixcookie($cookieFile); + + /* request calendar */ + $calParams = array( + 'startdt' => strftime('%d.%m.%Y'), + 'enddt' => strftime('%d.%m.%Y', time() + 6*31*24*60*60) /* halbes Jahr == ein Semester */ + ); + + $response = curl_request('GET', $baseUrl . $calPath, $cookieFile, $calParams); + curl_fixcookie($cookieFile); + + /* filter some changes */ + list($headers, $body) = explode("\r\n\r\n", $response, 2); + + + /* 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_' . $_GET['u'] . '.ics'; + break; + case 'Content-Type': + $value .= '; charset=utf-8'; + break; + } + + if ($key != 'Content-Disposition') { + header($key . ': ' . $value); + } + } + + $location = ''; + $lines = explode("\r\n", $body); + foreach ($lines as $line) { + if ($line) { + list($key, $value) = explode(":", $line); + switch ($key) { + case 'LOCATION': + $location = $value; + $room = strtok($location, " "); + $address = get_address($db, $room); + + if ($address === false) { + $address = preg_replace('/[ ]{2,}/sm', ' ', utf8_encode(crawl_address($room))); + set_address($db, $room, $address); + $crawled = true; + } + $value = $address . ', Aachen'; + break; + + case 'DESCRIPTION': + if ($value) $value .= '\n'; + $value .= $location; + break; + } + echo $key . ':' . $value; + } + echo "\r\n"; + } + + /* cleanup */ + unlink($cookieFile); + sqlite_close($db); +} +else { + echo ''; +?> + + + + + /dev/nulll - CampusOffice to Google Sync + + + + + + + + + +
+
+ 0l +

CampusOffice to Google Sync

+
+ +
+ + + + + + + + + +
+ + +
+ + +
+ + + + diff --git a/php/contactimg.php b/php/contactimg.php index bdb8ff2..1e900e1 100644 --- a/php/contactimg.php +++ b/php/contactimg.php @@ -142,7 +142,6 @@ echo ''; -