|
<?php |
|
|
|
header('Content-Type: application/json'); |
|
|
|
require_once 'settings.php'; |
|
|
|
class PasteAPI { |
|
private $db; |
|
private $settings; |
|
|
|
public function __construct() { |
|
$this->settings = new Settings(); |
|
$this->db = new SQLite3($this->settings->getSetting('db_path')); |
|
} |
|
|
|
public function createPaste($data) { |
|
|
|
if (empty($data['content'])) { |
|
return ['status' => 'error', 'message' => 'Content is required']; |
|
} |
|
|
|
|
|
$expire_time = isset($data['expire_time']) ? (int)$data['expire_time'] : 2592000; |
|
$max_expire_time = (int)$this->settings->getSetting('max_expire_time', 31536000); |
|
if ($expire_time > $max_expire_time) { |
|
$expire_time = $max_expire_time; |
|
} |
|
|
|
$max_views = isset($data['max_views']) ? (int)$data['max_views'] : 0; |
|
if ($max_views > 25565) { |
|
$max_views = 25565; |
|
} |
|
|
|
$is_markdown = isset($data['is_markdown']) && $data['is_markdown'] ? 1 : 0; |
|
$is_encrypted = isset($data['is_encrypted']) && $data['is_encrypted'] ? 1 : 0; |
|
|
|
|
|
$uuid = $this->generateUUID(); |
|
|
|
|
|
$now = time(); |
|
$expires_at = $now + $expire_time; |
|
|
|
|
|
$stmt = $this->db->prepare('INSERT INTO notes ( |
|
uuid, content, created_at, expires_at, max_views, |
|
current_views, is_encrypted, is_markdown |
|
) VALUES ( |
|
:uuid, :content, :created_at, :expires_at, :max_views, |
|
0, :is_encrypted, :is_markdown |
|
)'); |
|
|
|
$stmt->bindValue(':uuid', $uuid, SQLITE3_TEXT); |
|
$stmt->bindValue(':content', $data['content'], SQLITE3_TEXT); |
|
$stmt->bindValue(':created_at', $now, SQLITE3_INTEGER); |
|
$stmt->bindValue(':expires_at', $expires_at, SQLITE3_INTEGER); |
|
$stmt->bindValue(':max_views', $max_views, SQLITE3_INTEGER); |
|
$stmt->bindValue(':is_encrypted', $is_encrypted, SQLITE3_INTEGER); |
|
$stmt->bindValue(':is_markdown', $is_markdown, SQLITE3_INTEGER); |
|
|
|
if ($stmt->execute()) { |
|
$response = ['status' => 'success', 'uuid' => $uuid]; |
|
if ($is_encrypted && isset($data['encryption_key'])) { |
|
$response['encryption_key'] = $data['encryption_key']; |
|
} |
|
return $response; |
|
} |
|
|
|
return ['status' => 'error', 'message' => 'Failed to create paste']; |
|
} |
|
|
|
private function generateUUID() { |
|
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', |
|
mt_rand(0, 0xffff), mt_rand(0, 0xffff), |
|
mt_rand(0, 0xffff), |
|
mt_rand(0, 0x0fff) | 0x4000, |
|
mt_rand(0, 0x3fff) | 0x8000, |
|
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) |
|
); |
|
} |
|
} |
|
|
|
|
|
$method = $_SERVER['REQUEST_METHOD']; |
|
$api = new PasteAPI(); |
|
|
|
if ($method === 'POST') { |
|
$data = json_decode(file_get_contents('php://input'), true); |
|
echo json_encode($api->createPaste($data)); |
|
} else { |
|
http_response_code(405); |
|
echo json_encode(['status' => 'error', 'message' => 'Method not allowed']); |
|
} |
|
|