V1.16 -> 240820 neue Funktion "download_file($_id)"

This commit is contained in:
2024-08-22 08:20:27 +02:00
parent 6a56e88362
commit 91ac4fe409
2 changed files with 92 additions and 32 deletions

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
Nenninger N-Tools.de Nenninger N-Tools.de
Version 1.15 Version 1.16
*/ */
@@ -116,7 +116,7 @@ class UUID {
class hermineConnect{ class hermineConnect{
private $VERSION = '1.15'; private $VERSION = '1.16';
private $MACHINENAME = 'default'; private $MACHINENAME = 'default';
private $hermineServer = 'https://api.thw-messenger.de'; private $hermineServer = 'https://api.thw-messenger.de';
private $connectorID = ""; private $connectorID = "";
@@ -188,7 +188,7 @@ class hermineConnect{
curl_close($this->cURL); curl_close($this->cURL);
} }
function request($_url,$_data,$_files=[]){ function request($_url,$_data,$_files=[],$_rowData=false){
$_data['device_id'] = $this->connectorID; $_data['device_id'] = $this->connectorID;
if($this->client_key != '') if($this->client_key != '')
$_data['client_key'] = $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\nSendheader->:\n".print_r(curl_getinfo($this->cURL, CURLINFO_HEADER_OUT),true);
echo "\n\nretdata->:\n".print_r($data,true); echo "\n\nretdata->:\n".print_r($data,true);
} }
$data = json_decode($data); if(!$_rowData){
if($data->status->value === "OK"){ $data = json_decode($data);
$this->lasterror = ''; if($data->status->value === "OK"){
return $data->payload; $this->lasterror = '';
return $data->payload;
}else{
$this->lasterror = $data;
return false;
}
}else{ }else{
$this->lasterror = $data; return $data;
return false;
} }
} else { } else {
$this->lasterror = 'Curl error: ' . curl_error($this->cURL); $this->lasterror = 'Curl error: ' . curl_error($this->cURL);
@@ -278,31 +282,38 @@ class hermineConnect{
} }
} }
function _get_conversation_key($_target){ function _get_conversation_key($_target,$_key=''){
if($_target[0]=='conversation'){ if($_key == ''){
if(!isset($this->key_cache_conversations[$_target[1]])){ if($_target[0]=='conversation'){
$data = [ "conversation_id" => $_target[1] 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; $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; if(openssl_private_decrypt(base64_decode($this->key_cache_conversations[$_target[1]]),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING))
else return $ret;
return false; else
}else if($_target[0]=='channel'){ return false;
if(!isset($this->key_cache_channels[$_target[1]])){ }else if($_target[0]=='channel'){
$data = [ "channel_id" => $_target[1], if(!isset($this->key_cache_channels[$_target[1]])){
"without_members" => true $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; $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)) }else{
return $ret; if(openssl_private_decrypt(base64_decode($_key),$ret,$this->private_key,OPENSSL_PKCS1_OAEP_PADDING))
else return $ret;
return false; else
return false;
} }
} }
@@ -516,6 +527,48 @@ class hermineConnect{
return false; 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=[]){ function _delete_files($_ids=[]){
$data = [ $data = [
@@ -714,6 +767,10 @@ class hermineConnect{
return $this->_delete_files($_ids); return $this->_delete_files($_ids);
} }
public function download_file($_id){
return $this->_download_file($_id);
}
public function open_conversation($_members){ public function open_conversation($_members){
return $this->_open_conversation($_members); return $this->_open_conversation($_members);
} }

View File

@@ -12,6 +12,7 @@ Das Speichern von Zugangsdaten auf öffentlichen Servern stellt ein hohes Risiko
* V1.13 26.11.2023 -> open_conversation eingebaut * V1.13 26.11.2023 -> open_conversation eingebaut
* V1.14 -> 231220 sendmsg: Text wird jetzt als Markdown formatiert markiert (Parameter "metainfo") * 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.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: Formatierungen Markdown:
@@ -51,6 +52,8 @@ Das Speichern von Zugangsdaten auf öffentlichen Servern stellt ein hohes Risiko
list_uploaded_chat_files($_search); -< array list_uploaded_chat_files($_search); -< array
download_file($_id) -< array
delete_files($_ids=[]) -< boolean delete_files($_ids=[]) -< boolean
open_conversation($_members) -< array open_conversation($_members) -< array