408 lines
12 KiB
Markdown
408 lines
12 KiB
Markdown
# PrivateBin API Library
|
|
|
|
A C++ library for interacting with PrivateBin servers via the JSON API v1.3.
|
|
|
|
## Features
|
|
|
|
- **Text Paste Creation**: Create encrypted text pastes with multiple formats
|
|
- **File Upload**: Upload files as encrypted pastes
|
|
- **Paste Retrieval**: Retrieve and decrypt pastes
|
|
- **Paste Deletion**: Delete pastes with deletion tokens
|
|
- **End-to-End Encryption**: Client-side encryption with AES-256-GCM
|
|
- **Cross-Platform**: Support for Windows and Linux
|
|
- **Complete API**: Implementation of all PrivateBin v1.3 API functions
|
|
- **Automated Builds**: Platform-specific build scripts for easy compilation
|
|
- **Text Formatting**: Support for plaintext, syntax highlighting, and markdown
|
|
|
|
## Text Formatting Support
|
|
|
|
The library supports multiple text formats as defined in the [PrivateBin API v1.3](https://github.com/PrivateBin/PrivateBin/wiki/API):
|
|
|
|
### Available Formats
|
|
|
|
- **`plaintext`** - Plain text (default format)
|
|
- **`syntaxhighlighting`** - Syntax highlighting for code snippets
|
|
- **`markdown`** - Markdown formatting for rich text
|
|
|
|
### Format Usage
|
|
|
|
```c
|
|
#include "privatebinapi.h"
|
|
|
|
// Plain text format
|
|
create_paste(server, content, password, expiration, "plaintext", 0, 0, &url, &token);
|
|
|
|
// Syntax highlighting for code
|
|
create_paste(server, code_content, password, expiration, "syntaxhighlighting", 0, 0, &url, &token);
|
|
|
|
// Markdown formatting
|
|
create_paste(server, markdown_content, password, expiration, "markdown", 0, 0, &url, &token);
|
|
```
|
|
|
|
## File Upload Functionality
|
|
|
|
The library includes an `upload_file` function that allows you to securely upload files to PrivateBin servers:
|
|
|
|
```c
|
|
int upload_file(const char* server_url, const char* file_path,
|
|
const char* password, const char* expiration,
|
|
int burn_after_reading, int open_discussion,
|
|
char** paste_url, char** delete_token);
|
|
```
|
|
|
|
### File Upload Parameters
|
|
|
|
- **`server_url`**: The URL of the PrivateBin server
|
|
- **`file_path`**: The path to the file to upload
|
|
- **`password`**: Optional password for the paste (can be NULL)
|
|
- **`expiration`**: Expiration time ("5min", "10min", "1hour", "1day", "1week", "1month", "1year", "never")
|
|
- **`burn_after_reading`**: 1 for "burn after reading", 0 for "keep"
|
|
- **`open_discussion`**: 1 for allow discussion, 0 for disable discussion
|
|
- **`paste_url`**: Output parameter for the URL of the created paste
|
|
- **`delete_token`**: Output parameter for the deletion token
|
|
|
|
### File Upload Features
|
|
|
|
- **Binary Files**: Support for all file types
|
|
- **Size Limitation**: Maximum file size 100MB
|
|
- **Secure Encryption**: Same cryptography as text pastes
|
|
- **Compression**: Automatic zlib compression before encryption
|
|
- **Metadata**: File name, size, and type are added to metadata
|
|
- **Key Derivation**: PBKDF2-HMAC-SHA256 with 100,000 iterations
|
|
|
|
### How File Upload Works
|
|
|
|
1. **File Reading**: The file is read in binary mode
|
|
2. **Size Check**: Maximum file size is limited to 100MB
|
|
3. **Encryption**:
|
|
- Generation of a random 32-byte key
|
|
- File compression with zlib
|
|
- Encryption with AES-256-GCM
|
|
- Key derivation with PBKDF2-HMAC-SHA256 (100,000 iterations)
|
|
4. **Metadata**: File name, size, and type are added to metadata
|
|
5. **Upload**: Encrypted data is sent to the PrivateBin server
|
|
6. **URL Generation**: The URL is created with the Base58-encoded key
|
|
|
|
## Build Scripts
|
|
|
|
The project includes several build scripts in the `scripts/` directory for different platforms and use cases.
|
|
|
|
### Windows Build Scripts
|
|
|
|
#### PowerShell Build (Recommended)
|
|
**File:** `scripts/build_windows.ps1`
|
|
**Requirements:** PowerShell, Visual Studio 2022 Build Tools (C++), vcpkg (will be bootstrapped), Git
|
|
|
|
```powershell
|
|
# Run from project root
|
|
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\build_windows.ps1
|
|
```
|
|
|
|
This script:
|
|
- Automatically bootstraps vcpkg if not present
|
|
- Configures CMake with Visual Studio 2022 generator
|
|
- Builds the project in Release configuration
|
|
- Creates a Windows distribution package with all artifacts
|
|
|
|
#### Command Line Build
|
|
**File:** `scripts/build_thinkpad.bat`
|
|
**Requirements:** Visual Studio 2022 Build Tools/Community with C++ workload, vcpkg
|
|
|
|
```cmd
|
|
# Run from project root
|
|
scripts\build_thinkpad.bat
|
|
```
|
|
|
|
This script:
|
|
- Automatically detects and initializes Visual Studio environment
|
|
- Handles vcpkg bootstrapping
|
|
- Configures CMake with proper toolchain
|
|
- Builds the project using MSVC compiler
|
|
|
|
### Linux/macOS Build Script
|
|
**File:** `scripts/build.sh`
|
|
**Requirements:** CMake, C++17 compiler, vcpkg
|
|
|
|
```bash
|
|
# Make executable and run from project root
|
|
chmod +x scripts/build.sh
|
|
./scripts/build.sh
|
|
```
|
|
|
|
This script:
|
|
- Bootstraps vcpkg if not present
|
|
- Configures CMake with Unix Makefiles
|
|
- Builds the project in Release configuration
|
|
|
|
## Installation
|
|
|
|
### Dependencies
|
|
|
|
- CMake 3.10+
|
|
- C++17 compatible compiler
|
|
- Crypto++ (via vcpkg)
|
|
- nlohmann/json (via vcpkg)
|
|
|
|
### Compilation
|
|
|
|
#### Windows (PowerShell) - Build via scripts/build_windows.ps1
|
|
```powershell
|
|
# Requires: PowerShell, Visual Studio 2022 Build Tools (C++), vcpkg (will be bootstrapped), Git
|
|
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\build_windows.ps1
|
|
```
|
|
|
|
#### Windows (Command Line) - Build via scripts/build_thinkpad.bat
|
|
```cmd
|
|
# Requires: Visual Studio 2022 Build Tools/Community with C++ workload, vcpkg
|
|
scripts\build_thinkpad.bat
|
|
```
|
|
|
|
#### Linux/macOS - Build via scripts/build.sh
|
|
```bash
|
|
# Requires: CMake, C++17 compiler, vcpkg
|
|
chmod +x scripts/build.sh
|
|
./scripts/build.sh
|
|
```
|
|
|
|
#### Manual Build
|
|
```bash
|
|
mkdir build
|
|
cd build
|
|
cmake ..
|
|
cmake --build . --config Release
|
|
```
|
|
|
|
**Note:** The manual build method requires you to have all dependencies (CMake, compiler, vcpkg) properly configured. For most users, the platform-specific build scripts are recommended.
|
|
|
|
## Usage
|
|
|
|
### Text Paste with Formatting
|
|
|
|
The library supports multiple text formats as defined in the [PrivateBin API v1.3](https://github.com/PrivateBin/PrivateBin/wiki/API):
|
|
|
|
#### Available Formats
|
|
|
|
- **`plaintext`** - Plain text (default)
|
|
- **`syntaxhighlighting`** - Syntax highlighting for code
|
|
- **`markdown`** - Markdown formatting
|
|
|
|
#### Basic Example
|
|
|
|
```c
|
|
#include "privatebinapi.h"
|
|
|
|
char* paste_url = nullptr;
|
|
char* delete_token = nullptr;
|
|
|
|
int result = create_paste(
|
|
"https://privatebin.net",
|
|
"Hello, World!",
|
|
NULL, // no password
|
|
"1day", // expiration
|
|
"plaintext", // format
|
|
0, // don't burn after reading
|
|
0 // no discussion
|
|
);
|
|
|
|
if (result == 0) {
|
|
printf("Paste created: %s\n", paste_url);
|
|
free_string(paste_url);
|
|
free_string(delete_token);
|
|
}
|
|
```
|
|
|
|
#### Syntax Highlighting Example
|
|
|
|
```c
|
|
const char* code_content = R"(
|
|
#include <iostream>
|
|
|
|
int main() {
|
|
std::cout << "Hello, World!" << std::endl;
|
|
return 0;
|
|
}
|
|
)";
|
|
|
|
int result = create_paste(
|
|
"https://privatebin.net",
|
|
code_content,
|
|
NULL, // no password
|
|
"1week", // expiration
|
|
"syntaxhighlighting", // syntax highlighting format
|
|
0, // don't burn after reading
|
|
0 // no discussion
|
|
);
|
|
```
|
|
|
|
#### Markdown Example
|
|
|
|
```c
|
|
const char* markdown_content = R"(
|
|
# Header
|
|
|
|
This is **bold** and *italic* text.
|
|
|
|
## Code Block
|
|
```cpp
|
|
int x = 42;
|
|
std::cout << x << std::endl;
|
|
```
|
|
|
|
> This is a blockquote.
|
|
)";
|
|
|
|
int result = create_paste(
|
|
"https://privatebin.net",
|
|
markdown_content,
|
|
NULL, // no password
|
|
"1month", // expiration
|
|
"markdown", // markdown format
|
|
0, // don't burn after reading
|
|
0 // no discussion
|
|
);
|
|
```
|
|
|
|
### File Upload
|
|
|
|
```c
|
|
char* paste_url = nullptr;
|
|
char* delete_token = nullptr;
|
|
|
|
int result = upload_file(
|
|
"https://privatebin.net",
|
|
"/path/to/file.txt",
|
|
"mypassword", // optional password
|
|
"1week", // expiration
|
|
0, // don't burn after reading
|
|
0 // no discussion
|
|
);
|
|
|
|
if (result == 0) {
|
|
printf("Successfully uploaded!\n");
|
|
printf("URL: %s\n", paste_url);
|
|
printf("Delete Token: %s\n", delete_token);
|
|
|
|
// Free memory
|
|
free_string(paste_url);
|
|
free_string(delete_token);
|
|
}
|
|
```
|
|
|
|
## Examples
|
|
|
|
The library contains a comprehensive example program that demonstrates both text paste and file upload functionality:
|
|
|
|
### Running the Example
|
|
|
|
```bash
|
|
# Run basic example (tests all text formats)
|
|
./example
|
|
|
|
# Upload a file
|
|
./example --upload https://privatebin.net test.txt
|
|
|
|
# Upload with password and expiration
|
|
./example --upload https://privatebin.net test.txt mypassword 1week
|
|
|
|
# Upload with all options
|
|
./example --upload https://privatebin.net test.txt mypassword 1day 1 0
|
|
```
|
|
|
|
The basic example now demonstrates:
|
|
- **Plaintext format** - Simple text pastes
|
|
- **Syntax highlighting format** - Code with syntax highlighting
|
|
- **Markdown format** - Rich text formatting
|
|
- **Interactive format selection** - Shows available options
|
|
|
|
### Example Output
|
|
|
|
The example program demonstrates:
|
|
- Creating text pastes
|
|
- Retrieving paste content
|
|
- Deleting pastes
|
|
- File upload with various options
|
|
- Error handling for all operations
|
|
|
|
## API Reference
|
|
|
|
### Functions
|
|
|
|
- `create_paste()` - Creates a text paste with optional formatting
|
|
- `upload_file()` - Uploads a file
|
|
- `get_paste()` - Retrieves a paste
|
|
- `delete_paste()` - Deletes a paste
|
|
- `free_string()` - Frees memory
|
|
|
|
### Format Support
|
|
|
|
The `create_paste()` function supports the following formats as defined in the [PrivateBin API v1.3](https://github.com/PrivateBin/PrivateBin/wiki/API):
|
|
|
|
- **`plaintext`** - Default format for simple text
|
|
- **`syntaxhighlighting`** - Syntax highlighting for code snippets
|
|
- **`markdown`** - Markdown formatting for rich text
|
|
|
|
### Error Codes
|
|
|
|
- `0` - Success
|
|
- `1` - Network error
|
|
- `2` - Cryptographic error
|
|
- `3` - Invalid input (e.g., file not found or too large)
|
|
- `4` - Server error
|
|
- `5` - JSON parsing error
|
|
|
|
## Security
|
|
|
|
- **Client-Side Encryption**: All data is encrypted before upload
|
|
- **AES-256-GCM**: Modern encryption with authentication
|
|
- **PBKDF2**: Secure key derivation with 100,000 iterations
|
|
- **Random Keys**: Each paste receives a unique key
|
|
- **No Server Logs**: Server cannot read encrypted data
|
|
- **File Compression**: Automatic zlib compression before encryption
|
|
- **Binary Support**: All file types are treated as encrypted binary data
|
|
|
|
## Limitations
|
|
|
|
- **File Size**: Maximum file size is 100MB
|
|
- **File Type**: All file types are treated as binary data
|
|
- **Server Compatibility**: Works with PrivateBin v1.3+ servers
|
|
- **Format**: Files are always treated as "plaintext" (even if they are binary data)
|
|
|
|
## Error Handling
|
|
|
|
The library returns detailed error codes and logs errors to the console. Common errors:
|
|
|
|
- **File not found**: Check the file path
|
|
- **File too large**: Reduce file size or split it up
|
|
- **Network error**: Check server URL and internet connection
|
|
- **Server error**: The server might be temporarily unavailable
|
|
|
|
## License
|
|
|
|
See [LICENSE](LICENSE) for details.
|
|
|
|
## Changelog
|
|
|
|
### v0.1.1.5 (2025-08-28)
|
|
- **NEW**: Enhanced text format support (plaintext, syntax highlighting, markdown)
|
|
- **NEW**: Comprehensive format testing in examples and integration tests
|
|
- **IMPROVED**: Better API documentation with format examples
|
|
- **IMPROVED**: Enhanced test coverage for all supported formats
|
|
|
|
### v0.1.1.4 (2025-08-28)
|
|
- **NEW**: Automated release creation script (`scripts/create_release.ps1`)
|
|
- **NEW**: Build scripts moved to `scripts/` directory for better organization
|
|
- **IMPROVED**: Enhanced build documentation with platform-specific instructions
|
|
- **IMPROVED**: Better project structure and organization
|
|
|
|
### v0.1.1.1 (2025-08-28)
|
|
- **NEW**: Combined example program with both text and file upload functionality
|
|
- **IMPROVED**: Unified command-line interface for examples
|
|
- **IMPROVED**: Better error handling and user experience
|
|
|
|
### v0.1.1 (2025-08-28)
|
|
- **NEW**: File upload functionality added
|
|
- **NEW**: `upload_file()` function implemented
|
|
- **NEW**: Comprehensive example program
|
|
- **NEW**: Extended documentation for file upload
|
|
- **IMPROVED**: Better error handling
|
|
- **IMPROVED**: Cross-platform compatibility |