feat: v1.3-konforme API, HTTP-Fixes, Base64, Example erweitert; Makefile & README Setup
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
#define PRIVATEBIN_API_VERSION "1.3"
|
||||
|
||||
@@ -54,6 +55,7 @@ int create_paste(const char* server_url, const char* content,
|
||||
std::vector<unsigned char> plaintext(content, content + strlen(content));
|
||||
|
||||
// Compress the plaintext
|
||||
std::cerr << "[privatebinapi] compress..." << std::endl;
|
||||
std::vector<unsigned char> compressed_data = Crypto::compress(plaintext);
|
||||
|
||||
// Generate random salt and IV
|
||||
@@ -61,10 +63,12 @@ int create_paste(const char* server_url, const char* content,
|
||||
std::vector<unsigned char> iv = Crypto::generate_key(16);
|
||||
|
||||
// Derive key using PBKDF2
|
||||
std::cerr << "[privatebinapi] pbkdf2..." << std::endl;
|
||||
std::vector<unsigned char> derived_key = Crypto::pbkdf2_hmac_sha256(
|
||||
paste_passphrase, salt, 100000, 32);
|
||||
|
||||
// Encrypt the data
|
||||
std::cerr << "[privatebinapi] encrypt..." << std::endl;
|
||||
std::vector<unsigned char> auth_tag;
|
||||
std::vector<unsigned char> cipher_text = Crypto::encrypt(
|
||||
compressed_data, derived_key, iv, auth_tag);
|
||||
@@ -91,8 +95,12 @@ int create_paste(const char* server_url, const char* content,
|
||||
int status;
|
||||
std::string message, paste_id, url, del_token;
|
||||
if (!JsonParser::parse_response(response, status, message, paste_id, url, del_token)) {
|
||||
std::cerr << "[privatebinapi] raw response (unparsed): " << response << std::endl;
|
||||
return ERROR_JSON_PARSE;
|
||||
}
|
||||
if (status != 0) {
|
||||
std::cerr << "[privatebinapi] server status=" << status << ", message= " << message << std::endl;
|
||||
}
|
||||
|
||||
if (status != 0) {
|
||||
return ERROR_SERVER;
|
||||
@@ -109,7 +117,11 @@ int create_paste(const char* server_url, const char* content,
|
||||
copy_string_to_output(del_token, delete_token);
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "[privatebinapi] crypto error: " << e.what() << std::endl;
|
||||
return ERROR_CRYPTO;
|
||||
} catch (...) {
|
||||
std::cerr << "[privatebinapi] unknown crypto error" << std::endl;
|
||||
return ERROR_CRYPTO;
|
||||
}
|
||||
}
|
||||
@@ -122,15 +134,17 @@ int get_paste(const char* server_url, const char* paste_id,
|
||||
}
|
||||
|
||||
try {
|
||||
// Construct the URL
|
||||
std::string url = std::string(server_url) + "/" + paste_id;
|
||||
// Construct the URL with query per API: base?pasteID
|
||||
std::string url = std::string(server_url) + "?" + paste_id;
|
||||
|
||||
// Send GET request
|
||||
HttpClient client;
|
||||
std::string response;
|
||||
std::cerr << "[privatebinapi] GET " << url << std::endl;
|
||||
if (!client.get(url, response)) {
|
||||
return ERROR_NETWORK;
|
||||
}
|
||||
std::cerr << "[privatebinapi] GET response: " << response << std::endl;
|
||||
|
||||
// Parse the JSON response
|
||||
json json_data = json::parse(response);
|
||||
@@ -188,9 +202,11 @@ int delete_paste(const char* server_url, const char* paste_id,
|
||||
// Send DELETE request
|
||||
HttpClient client;
|
||||
std::string response;
|
||||
std::cerr << "[privatebinapi] DELETE payload: " << json_data << std::endl;
|
||||
if (!client.delete_req(server_url, json_data, response)) {
|
||||
return ERROR_NETWORK;
|
||||
}
|
||||
std::cerr << "[privatebinapi] DELETE response: " << response << std::endl;
|
||||
|
||||
// Parse response
|
||||
int status;
|
||||
|
||||
Reference in New Issue
Block a user