X-Git-Url: https://git.stricted.de/?p=GitHub%2FStricted%2Fspeedport-hybrid-php-api.git;a=blobdiff_plain;f=SpeedportHybrid.class.php;h=1c0e18f30fcb50d4308bed5eacacbc0e2ce3b2ec;hp=146c36ff22225aaee2c1e892776127ec3f13a9a2;hb=5e5d7118702c686e2d2d25218dcf1a6ba16f85d5;hpb=219ba6611420353fd3d6e61cf0adf7a67f71dd8d diff --git a/SpeedportHybrid.class.php b/SpeedportHybrid.class.php index 146c36f..1c0e18f 100644 --- a/SpeedportHybrid.class.php +++ b/SpeedportHybrid.class.php @@ -1,6 +1,7 @@ getValues($data['body']); if ($data['status'] == 'ok') { + // reset challenge and session + $this->challenge = ''; + $this->cookie = ''; + $this->token = ''; + $this->derivedk = ''; + // throw an exception because router is unavailable for other tasks // like $this->logout() or $this->checkLogin throw new RebootException('Router Reboot'); @@ -187,7 +194,7 @@ class SpeedportHybrid { * @param string $status * @return boolean */ - public function changeConnectionStatus ($status) { + public function changeDSLStatus ($status) { $this->checkLogin(); $path = 'data/Connect.json'; @@ -205,8 +212,134 @@ class SpeedportHybrid { } } else { - throw new RouterException(); + throw new RouterException('unknown status'); + } + } + + /** + * change lte connection status + * + * @param string $status + * @return boolean + */ + public function changeLTEStatus ($status) { + throw new Exception('unstable funtion'); + $path = 'data/Modules.json'; + + if ($status == '0' || $status == '1' || $status == 'yes' || $status == 'no') { + if ($status == 'yes') $status = '1'; + else if ($status == 'no') $status = '0'; + + $fields = array('csrf_token' => $this->token, 'use_lte' => $status); + $data = $this->sentEncryptedRequest($path, $fields, true); + + // debug only + return $data; + } + else { + throw new RouterException('unknown status'); + } + } + + /** + * get phone book entrys + * + * @return array + */ + public function getPhoneBookEntrys () { + $data = $this->getData('PhoneBook'); + $data = $this->getValues($data); + + if (isset($data['addbookentry'])) { + return $data['addbookentry']; + } + else { + return array(); + } + } + + /** + * add Phone Book Entry + * + * @param string $name + * @param string $firstname + * @param string $private + * @param string $work + * @param string $mobile + * @param integer $id + * + * @return array + */ + public function addPhoneBookEntry ($name, $firstname, $private, $work, $mobile, $id = -1) { + $this->checkLogin(); + + $path = 'data/PhoneBook.json'; + $fields = array( + 'csrf_token' => $this->getToken(), + 'id' => $id, + 'search' => '', + 'phonebook_name' => $name, + 'phonebook_vorname' => $firstname, + 'phonebook_number_p' => $private, + 'phonebook_number_a' => $work, + 'phonebook_number_m' => $mobile + ); + + $data = $this->sentRequest($path, $fields, true); + $data = $this->getValues($data['body']); + + if ($data['status'] == 'ok') { + return $data; + } + else { + throw new RouterException('can not add/edit Phone Book Entry'); + } + } + + /** + * edit Phone Book Entry + * + * @param integer $id + * @param string $name + * @param string $firstname + * @param string $private + * @param string $work + * @param string $mobile + * + * @return array + */ + public function changePhoneBookEntry ($id, $name, $firstname, $private, $work, $mobile) { + return $this->addPhoneBookEntry($name, $firstname, $private, $work, $private, $id); + } + + /** + * delete Phone Book Entry + * + * @param integer $id + * + * @return array + */ + public function deletePhoneBookEntry ($id) { + $this->checkLogin(); + + $path = 'data/PhoneBook.json'; + $fields = array( + 'csrf_token' => $this->getToken(), + 'id' => $id, + 'deleteEntry' => 'delete' + ); + + $data = $this->sentRequest($path, $fields, true); + $data = $this->getValues($data['body']); + print_r($data); + + if ($data['status'] == 'ok') { + return $data; + } + else { + throw new RouterException('can not delete Phone Book Entry'); } + } /** @@ -215,8 +348,7 @@ class SpeedportHybrid { * @return string */ public function getUptime () { - // TODO: search for a better solution, calling Connect.json need some time - $data = $this->getData('Connect'); + $data = $this->getData('LAN'); $data = $this->getValues($data); return $data['days_online']; @@ -244,7 +376,15 @@ class SpeedportHybrid { * @return array */ public function getSyslog() { - return $this->exportData('0'); + $data = $this->getData('SystemMessages'); + $data = $this->getValues($data); + + if (isset($data['addmessage'])) { + return $data['addmessage']; + } + else { + return array(); + } } /** @@ -253,7 +393,15 @@ class SpeedportHybrid { * @return array */ public function getMissedCalls() { - return $this->exportData('1'); + $data = $this->getData('PhoneCalls'); + $data = $this->getValues($data); + + if (isset($data['addmissedcalls'])) { + return $data['addmissedcalls']; + } + else { + return array(); + } } /** @@ -262,7 +410,15 @@ class SpeedportHybrid { * @return array */ public function getTakenCalls() { - return $this->exportData('2'); + $data = $this->getData('PhoneCalls'); + $data = $this->getValues($data); + + if (isset($data['addtakencalls'])) { + return $data['addtakencalls']; + } + else { + return array(); + } } /** @@ -271,22 +427,15 @@ class SpeedportHybrid { * @return array */ public function getDialedCalls() { - return $this->exportData('3'); - } - - /** - * export data from router - * - * @return array - */ - private function exportData ($type) { - $this->checkLogin(); - - $path = 'data/Syslog.json'; - $fields = array('exporttype' => $type); - $data = $this->sentRequest($path, $fields, true); + $data = $this->getData('PhoneCalls'); + $data = $this->getValues($data); - return explode("\n", $data['body']); + if (isset($data['adddialedcalls'])) { + return $data['adddialedcalls']; + } + else { + return array(); + } } /** @@ -343,16 +492,14 @@ class SpeedportHybrid { * @return array */ private function decrypt ($data) { - require_once 'CryptLib/CryptLib.php'; - $factory = new CryptLib\Cipher\Factory(); - $aes = $factory->getBlockCipher('rijndael-128'); - $iv = hex2bin(substr($this->challenge, 16, 16)); $adata = hex2bin(substr($this->challenge, 32, 16)); - $dkey = hex2bin($this->derivedk); + $key = hex2bin($this->derivedk); $enc = hex2bin($data); - $aes->setKey($dkey); + $factory = new CryptLib\Cipher\Factory(); + $aes = $factory->getBlockCipher('rijndael-128'); + $aes->setKey($key); $mode = $factory->getMode('ccm', $aes, $iv, [ 'adata' => $adata, 'lSize' => 7]); $mode->decrypt($enc); @@ -363,21 +510,19 @@ class SpeedportHybrid { /** * decrypt data for the router * - * @param array $data + * @param string $data * @return string */ private function encrypt ($data) { - require_once 'CryptLib/CryptLib.php'; - $factory = new CryptLib\Cipher\Factory(); - $aes = $factory->getBlockCipher('rijndael-128'); - $iv = hex2bin(substr($this->challenge, 16, 16)); $adata = hex2bin(substr($this->challenge, 32, 16)); - $dkey = hex2bin($this->derivedk); + $key = hex2bin($this->derivedk); - $aes->setKey($dkey); + $factory = new CryptLib\Cipher\Factory(); + $aes = $factory->getBlockCipher('rijndael-128'); + $aes->setKey($key); $mode = $factory->getMode('ccm', $aes, $iv, [ 'adata' => $adata, 'lSize' => 7]); - $mode->encrypt(http_build_query($data)); + $mode->encrypt($data); return bin2hex($mode->finish()); } @@ -391,11 +536,23 @@ class SpeedportHybrid { private function getValues($array) { $data = array(); foreach ($array as $item) { - if (is_array($item['varvalue'])) { - $data[$item['varid']] = $this->getValues($item['varvalue']); + // thank you telekom for this piece of shit + if ($item['vartype'] == 'template') { + if (is_array($item['varvalue'])) { + $data[$item['varid']][] = $this->getValues($item['varvalue']); + } + else { + // i dont know if we need this + $data[$item['varid']] = $item['varvalue']; + } } else { - $data[$item['varid']] = $item['varvalue']; + if (is_array($item['varvalue'])) { + $data[$item['varid']] = $this->getValues($item['varvalue']); + } + else { + $data[$item['varid']] = $item['varvalue']; + } } } @@ -412,7 +569,7 @@ class SpeedportHybrid { */ private function sentEncryptedRequest ($path, $fields, $cookie = false) { $count = count($fields); - $fields = $this->encrypt($fields); + $fields = $this->encrypt(http_build_query($fields)); return $this->sentRequest($path, $fields, $cookie, $count); } @@ -448,10 +605,6 @@ class SpeedportHybrid { curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); - if ($cookie) { - - } - $result = curl_exec($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); @@ -517,7 +670,6 @@ class SpeedportHybrid { // calculate derivedk if (!function_exists('hash_pbkdf2')) { - require_once 'CryptLib/CryptLib.php'; $pbkdf2 = new CryptLib\Key\Derivation\PBKDF\PBKDF2(array('hash' => 'sha1')); $derivedk = bin2hex($pbkdf2->derive(hash('sha256', $password), substr($this->challenge, 0, 16), 1000, 32)); $derivedk = substr($derivedk, 0, 32);