diff --git a/hermineConnect.php b/hermineConnect.php index eb1400d..e0ea02c 100644 --- a/hermineConnect.php +++ b/hermineConnect.php @@ -1,7 +1,7 @@ cURL); } - function request($_url,$_data,$_files=[]){ + function request($_url,$_data,$_files=[],$_rowData=false){ $_data['device_id'] = $this->connectorID; if($this->client_key != '') $_data['client_key'] = $this->client_key; @@ -224,13 +224,17 @@ class hermineConnect{ echo "\n\nSendheader->:\n".print_r(curl_getinfo($this->cURL, CURLINFO_HEADER_OUT),true); echo "\n\nretdata->:\n".print_r($data,true); } - $data = json_decode($data); - if($data->status->value === "OK"){ - $this->lasterror = ''; - return $data->payload; + if(!$_rowData){ + $data = json_decode($data); + if($data->status->value === "OK"){ + $this->lasterror = ''; + return $data->payload; + }else{ + $this->lasterror = $data; + return false; + } }else{ - $this->lasterror = $data; - return false; + return $data; } } else { $this->lasterror = 'Curl error: ' . curl_error($this->cURL); @@ -278,31 +282,38 @@ class hermineConnect{ } } - function _get_conversation_key($_target){ - if($_target[0]=='conversation'){ - if(!isset($this->key_cache_conversations[$_target[1]])){ - $data = [ "conversation_id" => $_target[1] - ]; - $response = $this->request($this->hermineServer."/message/conversation",$data); - $this->key_cache_conversations[$_target[1]] = $response->conversation->key; - } - if(openssl_private_decrypt(base64_decode($this->key_cache_conversations[$_target[1]]),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING)) - return $ret; - else - return false; - }else if($_target[0]=='channel'){ - if(!isset($this->key_cache_channels[$_target[1]])){ - $data = [ "channel_id" => $_target[1], - "without_members" => true - ]; - $response = $this->request($this->hermineServer."/channels/info",$data); - $this->key_cache_channels[$_target[1]] = $response->channels->key; + function _get_conversation_key($_target,$_key=''){ + if($_key == ''){ + if($_target[0]=='conversation'){ + if(!isset($this->key_cache_conversations[$_target[1]])){ + $data = [ "conversation_id" => $_target[1] + ]; + $response = $this->request($this->hermineServer."/message/conversation",$data); + $this->key_cache_conversations[$_target[1]] = $response->conversation->key; + } + if(openssl_private_decrypt(base64_decode($this->key_cache_conversations[$_target[1]]),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING)) + return $ret; + else + return false; + }else if($_target[0]=='channel'){ + if(!isset($this->key_cache_channels[$_target[1]])){ + $data = [ "channel_id" => $_target[1], + "without_members" => true + ]; + $response = $this->request($this->hermineServer."/channels/info",$data); + $this->key_cache_channels[$_target[1]] = $response->channels->key; + } + if(openssl_private_decrypt(base64_decode($this->key_cache_channels[$_target[1]]),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING)) + return $ret; + else + return false; } - if(openssl_private_decrypt(base64_decode($this->key_cache_channels[$_target[1]]),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING)) - return $ret; - else - return false; + }else{ + if(openssl_private_decrypt(base64_decode($_key),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING)) + return $ret; + else + return false; } } @@ -516,6 +527,48 @@ class hermineConnect{ return false; } } + + function _file_info($_id){ + $data = [ + "file_id" => $_id + ]; + + $response = $this->request($this->hermineServer."/file/info",$data); + + if($response !== false){ + return $response; + }else{ + return false; + } + } + + function _download_file($_id){ + $fileInfo = $this->_file_info($_id); + //print_r($fileInfo); + $response = $this->request($this->hermineServer."/file/download?id=".$_id,[],[],true); + + $ret = []; + + if($response !== false){ + $ret[0]['name'] = $fileInfo->file->name; + $ret[0]['mime'] = $fileInfo->file->mime; + if($fileInfo->file->encrypted){ + $key = $fileInfo->file->keys[0]; + $conversation_key = $this->_get_conversation_key([$key->type,$key->chat_id],$key->chat_key); + $decryptedkey = $this->_decrypt_aes(base64_encode(hex2bin($key->key)), $conversation_key, hex2bin($key->iv)); + $decrypted = $this->_decrypt_aes(base64_encode($response), $decryptedkey, hex2bin($fileInfo->file->e2e_iv)); + if($decrypted !== false) + $ret[1] = $decrypted; + else + return '[!!decrypterror!!]'; + }else{ + $ret[1] = $response; + } + }else{ + $ret = false; + } + return $ret; + } function _delete_files($_ids=[]){ $data = [ @@ -714,6 +767,10 @@ class hermineConnect{ return $this->_delete_files($_ids); } + public function download_file($_id){ + return $this->_download_file($_id); + } + public function open_conversation($_members){ return $this->_open_conversation($_members); } diff --git a/readme.txt b/readme.txt index 58c7f92..2fc9f17 100644 --- a/readme.txt +++ b/readme.txt @@ -12,6 +12,7 @@ Das Speichern von Zugangsdaten auf öffentlichen Servern stellt ein hohes Risiko * V1.13 26.11.2023 -> open_conversation eingebaut * V1.14 -> 231220 sendmsg: Text wird jetzt als Markdown formatiert markiert (Parameter "metainfo") * V1.15 -> 240208 Die Logindaten und der Keks werden jetzt von der php Datei aus im Unterverzeichnis /data gespeichert (muss von Hand erstellt werden) + * V1.16 -> 240820 neue Funktion "download_file($_id)" Formatierungen Markdown: @@ -51,6 +52,8 @@ Das Speichern von Zugangsdaten auf öffentlichen Servern stellt ein hohes Risiko list_uploaded_chat_files($_search); -< array + download_file($_id) -< array + delete_files($_ids=[]) -< boolean open_conversation($_members) -< array