Build: successful library and example compilation; merge file upload into unified example program; update CMakeLists.txt
This commit is contained in:
@ -1,101 +1,193 @@
|
||||
#include "privatebinapi.h"
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <cstdlib>
|
||||
|
||||
int main() {
|
||||
int main(int argc, char* argv[]) {
|
||||
std::cout << "PrivateBin API C++ DLL Example" << std::endl;
|
||||
std::cout << "===============================" << std::endl;
|
||||
|
||||
// Example of how to use the API
|
||||
char* paste_url = nullptr;
|
||||
char* delete_token = nullptr;
|
||||
|
||||
std::cout << "Creating paste on https://privatebin.medisoftware.org..." << std::endl;
|
||||
|
||||
// Testing against https://privatebin.medisoftware.org
|
||||
int result = create_paste(
|
||||
"https://privatebin.medisoftware.org", // Server URL
|
||||
"Hello, PrivateBin from C++ Library!", // Content
|
||||
nullptr, // No password
|
||||
"1hour", // Expire in 1 hour
|
||||
"plaintext", // Plain text format
|
||||
0, // Don't burn after reading
|
||||
0, // No discussion
|
||||
&paste_url, // Output: paste URL
|
||||
&delete_token // Output: delete token
|
||||
);
|
||||
|
||||
std::cout << "create_paste returned: " << result << std::endl;
|
||||
|
||||
if (result == 0) {
|
||||
std::cout << "Paste created successfully!" << std::endl;
|
||||
std::cout << "URL: " << paste_url << std::endl;
|
||||
std::cout << "Delete token: " << delete_token << std::endl;
|
||||
|
||||
// Parse paste_id and key from URL (format: "/?{pasteID}#{key}")
|
||||
std::string full_url = paste_url ? paste_url : "";
|
||||
std::string paste_id;
|
||||
std::string key;
|
||||
auto qpos = full_url.find('?');
|
||||
auto hpos = full_url.find('#');
|
||||
if (qpos != std::string::npos) {
|
||||
if (hpos != std::string::npos && hpos > qpos + 1) {
|
||||
paste_id = full_url.substr(qpos + 1, hpos - (qpos + 1));
|
||||
key = full_url.substr(hpos + 1);
|
||||
} else if (qpos + 1 < full_url.size()) {
|
||||
paste_id = full_url.substr(qpos + 1);
|
||||
}
|
||||
// Check if file upload mode is requested
|
||||
if (argc >= 3 && strcmp(argv[1], "--upload") == 0) {
|
||||
// File upload mode
|
||||
if (argc < 4) {
|
||||
std::cout << "Usage: " << argv[0] << " --upload <server_url> <file_path> [password] [expiration] [burn_after_reading] [open_discussion]" << std::endl;
|
||||
std::cout << "Example: " << argv[0] << " --upload https://privatebin.net test.txt mypassword 1day 0 0" << std::endl;
|
||||
std::cout << std::endl;
|
||||
std::cout << "Parameters:" << std::endl;
|
||||
std::cout << " server_url - URL of the PrivateBin server" << std::endl;
|
||||
std::cout << " file_path - Path to the file to upload" << std::endl;
|
||||
std::cout << " password - Optional: Password for the paste (default: none)" << std::endl;
|
||||
std::cout << " expiration - Optional: Expiration time (default: 1day)" << std::endl;
|
||||
std::cout << " burn_after_reading - Optional: Burn after reading (0=no, 1=yes, default: 0)" << std::endl;
|
||||
std::cout << " open_discussion - Optional: Allow discussion (0=no, 1=yes, default: 0)" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Try to fetch paste content back
|
||||
if (!paste_id.empty() && !key.empty()) {
|
||||
std::cout << "Fetching paste..." << std::endl;
|
||||
char* content = nullptr;
|
||||
int gr = get_paste("https://privatebin.medisoftware.org", paste_id.c_str(), key.c_str(), &content);
|
||||
std::cout << "get_paste returned: " << gr << std::endl;
|
||||
if (gr == 0 && content) {
|
||||
std::cout << "Content: " << content << std::endl;
|
||||
free_string(content);
|
||||
}
|
||||
}
|
||||
const char* server_url = argv[2];
|
||||
const char* file_path = argv[3];
|
||||
const char* password = (argc > 4) ? argv[4] : nullptr;
|
||||
const char* expiration = (argc > 5) ? argv[5] : "1day";
|
||||
int burn_after_reading = (argc > 6) ? std::atoi(argv[6]) : 0;
|
||||
int open_discussion = (argc > 7) ? std::atoi(argv[7]) : 0;
|
||||
|
||||
// Try to delete paste
|
||||
if (!paste_id.empty() && delete_token) {
|
||||
std::cout << "Deleting paste..." << std::endl;
|
||||
int dr = delete_paste("https://privatebin.medisoftware.org", paste_id.c_str(), delete_token);
|
||||
std::cout << "delete_paste returned: " << dr << std::endl;
|
||||
std::cout << "PrivateBin File Upload Example" << std::endl;
|
||||
std::cout << "===============================" << std::endl;
|
||||
std::cout << "Server: " << server_url << std::endl;
|
||||
std::cout << "File: " << file_path << std::endl;
|
||||
if (password) {
|
||||
std::cout << "Password: " << password << std::endl;
|
||||
}
|
||||
std::cout << "Expiration: " << expiration << std::endl;
|
||||
std::cout << "Burn after reading: " << (burn_after_reading ? "Yes" : "No") << std::endl;
|
||||
std::cout << "Allow discussion: " << (open_discussion ? "Yes" : "No") << std::endl;
|
||||
std::cout << std::endl;
|
||||
|
||||
// Clean up allocated memory
|
||||
free_string(paste_url);
|
||||
free_string(delete_token);
|
||||
} else {
|
||||
std::cout << "Failed to create paste. Error code: " << result << std::endl;
|
||||
char* paste_url = nullptr;
|
||||
char* delete_token = nullptr;
|
||||
|
||||
std::cout << "Uploading file..." << std::endl;
|
||||
|
||||
// Print error codes explanation
|
||||
switch(result) {
|
||||
case 1:
|
||||
std::cout << "Network error occurred." << std::endl;
|
||||
break;
|
||||
case 2:
|
||||
std::cout << "Encryption/decryption error occurred." << std::endl;
|
||||
break;
|
||||
case 3:
|
||||
std::cout << "Invalid input provided." << std::endl;
|
||||
break;
|
||||
case 4:
|
||||
std::cout << "Server error occurred." << std::endl;
|
||||
break;
|
||||
case 5:
|
||||
std::cout << "JSON parsing error occurred." << std::endl;
|
||||
break;
|
||||
default:
|
||||
std::cout << "Unknown error occurred." << std::endl;
|
||||
break;
|
||||
int result = upload_file(server_url, file_path, password, expiration,
|
||||
burn_after_reading, open_discussion,
|
||||
&paste_url, &delete_token);
|
||||
|
||||
if (result == 0) {
|
||||
std::cout << "Successfully uploaded!" << std::endl;
|
||||
std::cout << "Paste URL: " << paste_url << std::endl;
|
||||
std::cout << "Delete Token: " << delete_token << std::endl;
|
||||
std::cout << std::endl;
|
||||
std::cout << "Note: Keep the delete token safe to delete the paste later." << std::endl;
|
||||
|
||||
// Free memory
|
||||
free_string(paste_url);
|
||||
free_string(delete_token);
|
||||
} else {
|
||||
std::cout << "Error uploading file!" << std::endl;
|
||||
std::cout << "Error code: " << result << std::endl;
|
||||
|
||||
switch (result) {
|
||||
case 1:
|
||||
std::cout << "Error: Network problem" << std::endl;
|
||||
break;
|
||||
case 2:
|
||||
std::cout << "Error: Cryptographic error" << std::endl;
|
||||
break;
|
||||
case 3:
|
||||
std::cout << "Error: Invalid input (e.g., file not found or too large)" << std::endl;
|
||||
break;
|
||||
case 4:
|
||||
std::cout << "Error: Server error" << std::endl;
|
||||
break;
|
||||
case 5:
|
||||
std::cout << "Error: JSON parsing error" << std::endl;
|
||||
break;
|
||||
default:
|
||||
std::cout << "Error: Unknown error" << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (result == 0) ? 0 : 1;
|
||||
} else {
|
||||
// Interactive mode - show usage and run basic example
|
||||
std::cout << "Usage:" << std::endl;
|
||||
std::cout << " " << argv[0] << " - Run basic example" << std::endl;
|
||||
std::cout << " " << argv[0] << " --upload <args> - Upload a file" << std::endl;
|
||||
std::cout << std::endl;
|
||||
|
||||
// Example of how to use the API
|
||||
char* paste_url = nullptr;
|
||||
char* delete_token = nullptr;
|
||||
|
||||
std::cout << "Creating paste on https://privatebin.medisoftware.org..." << std::endl;
|
||||
|
||||
// Testing against https://privatebin.medisoftware.org
|
||||
int result = create_paste(
|
||||
"https://privatebin.medisoftware.org", // Server URL
|
||||
"Hello, PrivateBin from C++ Library!", // Content
|
||||
nullptr, // No password
|
||||
"1hour", // Expire in 1 hour
|
||||
"plaintext", // Plain text format
|
||||
0, // Don't burn after reading
|
||||
0, // No discussion
|
||||
&paste_url, // Output: paste URL
|
||||
&delete_token // Output: delete token
|
||||
);
|
||||
|
||||
std::cout << "create_paste returned: " << result << std::endl;
|
||||
|
||||
if (result == 0) {
|
||||
std::cout << "Paste created successfully!" << std::endl;
|
||||
std::cout << "URL: " << paste_url << std::endl;
|
||||
std::cout << "Delete token: " << delete_token << std::endl;
|
||||
|
||||
// Parse paste_id and key from URL (format: "/?{pasteID}#{key}")
|
||||
std::string full_url = paste_url ? paste_url : "";
|
||||
std::string paste_id;
|
||||
std::string key;
|
||||
auto qpos = full_url.find('?');
|
||||
auto hpos = full_url.find('#');
|
||||
if (qpos != std::string::npos) {
|
||||
if (hpos != std::string::npos && hpos > qpos + 1) {
|
||||
paste_id = full_url.substr(qpos + 1, hpos - (qpos + 1));
|
||||
key = full_url.substr(hpos + 1);
|
||||
} else if (qpos + 1 < full_url.size()) {
|
||||
paste_id = full_url.substr(qpos + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Try to fetch paste content back
|
||||
if (!paste_id.empty() && !key.empty()) {
|
||||
std::cout << "Fetching paste..." << std::endl;
|
||||
char* content = nullptr;
|
||||
int gr = get_paste("https://privatebin.medisoftware.org", paste_id.c_str(), key.c_str(), &content);
|
||||
std::cout << "get_paste returned: " << gr << std::endl;
|
||||
if (gr == 0 && content) {
|
||||
std::cout << "Content: " << content << std::endl;
|
||||
free_string(content);
|
||||
}
|
||||
}
|
||||
|
||||
// Try to delete paste
|
||||
if (!paste_id.empty() && delete_token) {
|
||||
std::cout << "Deleting paste..." << std::endl;
|
||||
int dr = delete_paste("https://privatebin.medisoftware.org", paste_id.c_str(), delete_token);
|
||||
std::cout << "delete_paste returned: " << dr << std::endl;
|
||||
}
|
||||
|
||||
// Clean up allocated memory
|
||||
free_string(paste_url);
|
||||
free_string(delete_token);
|
||||
} else {
|
||||
std::cout << "Failed to create paste. Error code: " << result << std::endl;
|
||||
|
||||
// Print error codes explanation
|
||||
switch(result) {
|
||||
case 1:
|
||||
std::cout << "Network error occurred." << std::endl;
|
||||
break;
|
||||
case 2:
|
||||
std::cout << "Encryption/decryption error occurred." << std::endl;
|
||||
break;
|
||||
case 3:
|
||||
std::cout << "Invalid input provided." << std::endl;
|
||||
break;
|
||||
case 4:
|
||||
std::cout << "Server error occurred." << std::endl;
|
||||
break;
|
||||
case 5:
|
||||
std::cout << "JSON parsing error occurred." << std::endl;
|
||||
break;
|
||||
default:
|
||||
std::cout << "Unknown error occurred." << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Example completed." << std::endl;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::cout << "Example completed." << std::endl;
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user