stupid AES mode CCM -.-
[GitHub/Stricted/speedport-hybrid-php-api.git] / speedport.class.php
index 87d4c1c7bfc74a45254acae399ec8a7cb07ef04b..83c6b638312d1f8f8fd942b5169ecd2a8b09eec8 100644 (file)
@@ -29,6 +29,12 @@ class speedport {
         */
        private $url = '';
        
+       /**
+        * derivedk cookie
+        * @var string
+        */
+       private $derivedk = '';
+       
        public function __construct ($password, $url = 'http://speedport.ip/') {
                $this->url = $url;
                $this->getChallenge();
@@ -59,7 +65,7 @@ class speedport {
        
        /**
         * login into the router with the given password
-        *
+        * 
         * @param       string  $password
         * @return      boolean
         */
@@ -79,6 +85,9 @@ class speedport {
                                        throw new Exception('unable to get the session cookie from the router');
                                }
                                
+                               // calculate derivedk
+                               $this->derivedk = hash_pbkdf2('sha1', hash('sha256', $password), substr($this->challenge, 0, 16), 1000, 32);
+                               
                                return true;
                        }
                }
@@ -88,7 +97,7 @@ class speedport {
        
        /**
         * logout
-        *
+        * 
         * @return      array
         */
        public function logout () {
@@ -106,7 +115,7 @@ class speedport {
        
        /**
         * reboot the router
-        *
+        * 
         * @return      array
         */
        public function reboot () {
@@ -121,7 +130,7 @@ class speedport {
        
        /**
         * change dsl connection status
-        *
+        * 
         * @param       string  $status
         */
        public function changeConnectionStatus ($status) {
@@ -139,7 +148,7 @@ class speedport {
        
        /**
         * return the given json as array
-        *
+        * 
         * the following paths are known to be valid:
         * /data/dsl.json
         * /data/interfaces.json
@@ -162,9 +171,9 @@ class speedport {
         * /data/filterlist.json
         * /data/bonding_tr181.json
         * /data/letinfo.json
-        *
+        * 
         * /data/Status.json (No login needed)
-        *
+        * 
         * @param       string  $file
         * @return      array
         */
@@ -183,9 +192,126 @@ class speedport {
                return $json;
        }
        
+       /**
+        * get the router syslog
+        * 
+        * @return      array
+        */
+       public function getSyslog() {
+               $path = 'data/Syslog.json';
+               $fields = array('exporttype' => '0');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               
+               if (empty($data['body'])) {
+                       throw new Exception('unable to get syslog data');
+               }
+               
+               return explode("\n", $data['body']);
+       }
+       
+       /**
+        * get the Missed Calls from router
+        * 
+        * @return      array
+        */
+       public function getMissedCalls() {
+               $path = 'data/ExportMissedCalls.json';
+               $fields = array('exporttype' => '1');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               
+               if (empty($data['body'])) {
+                       throw new Exception('unable to get syslog data');
+               }
+               
+               return explode("\n", $data['body']);
+       }
+       
+       /**
+        * get the Taken Calls from router
+        * 
+        * @return      array
+        */
+       public function getTakenCalls() {
+               $path = 'data/ExportTakenCalls.json';
+               $fields = array('exporttype' => '2');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               
+               if (empty($data['body'])) {
+                       throw new Exception('unable to get syslog data');
+               }
+               
+               return explode("\n", $data['body']);
+       }
+       
+       /**
+        * get the Dialed Calls from router
+        * 
+        * @return      array
+        */
+       public function getDialedCalls() {
+               $path = 'data/ExportDialedCalls.json';
+               $fields = array('exporttype' => '3');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               
+               if (empty($data['body'])) {
+                       throw new Exception('unable to get syslog data');
+               }
+               
+               return explode("\n", $data['body']);
+       }
+       
+       /*
+       // we cant encrypt and decrypt AES with mode CCM, we need AES with CCM mode for the commands
+       // (stupid, all other data are send as plaintext and some 'normal' data are encrypted...)
+       public function reconnectLte () {
+               $path = 'data/modules.json';
+               $fields = array('csrf_token' => 'nulltoken', 'showpw' => 0, 'password' => $this->hash, 'lte_reconn' => 'true');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               $json = json_decode($data['body'], true);
+               
+               return $json;
+       }
+       */
+       /*
+       public function resetToFactoryDefault () {
+               $path = 'data/resetAllSetting.json';
+               $fields = array('csrf_token' => 'nulltoken', 'showpw' => 0, 'password' => $this->hash, 'reset_all' => 'true');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               $json = json_decode($data['body'], true);
+               
+               return $json;
+       }
+       */
+       
+       /**
+        * check if firmware is actual
+        * 
+        * @return      array
+        */
+       public function checkFirmware () {
+               $path = 'data/checkfirmware.json';
+               $fields = array('checkfirmware' => 'true');
+               $cookie = 'challengev='.$this->challenge.'; '.$this->session;
+               $data = $this->sentRequest($path, $fields, $cookie);
+               
+               if (empty($data['body'])) {
+                       throw new Exception('unable to get checkfirmware data');
+               }
+               
+               $json = json_decode($data['body'], true);
+               
+               return $json;
+       }
+       
        /**
         * sends the request to router
-        *
+        * 
         * @param       string  $path
         * @param       array   $fields
         * @param       string  $cookie
@@ -223,18 +349,15 @@ class speedport {
                // fix invalid json
                $body = preg_replace("/(\r\n)|(\r)/", "\n", $body);
                $body = preg_replace('/\'/i', '"', $body);
-               $body = preg_replace("/},\n\n]/", "}\n]", $body);
-               $body = preg_replace('/\s+/', ' ', $body);
-               $body = preg_replace("/\[ \]/i", '[ {} ]', $body);
-               $body = preg_replace("/}, ]/", "} ]", $body);
-               $body = preg_replace("/\n/", " ", $body);
+               $body = preg_replace("/\[\s+\]/i", '[ {} ]', $body);
+               $body = preg_replace("/},\s+]/", "}\n]", $body);
                
                return array('header' => $this->parse_headers($header), 'body' => $body);
        }
        
        /**
         * parse the curl return header into an array
-        *
+        * 
         * @param       string  $response
         * @return      array
         */