- 1<?php
- 2
- 3 * paste.lesalkodiques.info
- 4 * Fichier : /theme/default/main.php
- 5 * Licence : GPL-3.0-or-later (voir LICENCE)
- 6 */
- 7
- 8$cap_e = $_SESSION['cap_e'] ?? 'off';
- 9$captcha_mode = $_SESSION['captcha_mode'] ?? 'none';
- 10$main_sitekey = $_SESSION['captcha'] ?? '';
- 11
- 12$nonce = $GLOBALS['csp_nonce'] ?? '';
- 13?>
- 14
- 15<div class="container-xxl my-4">
- 16 <div class="row">
- 17 <?php if (isset($privatesite) && $privatesite === "on"): ?>
- 18 <div class="col-lg-12">
- 19 <?php if (!isset($_SESSION['username'])): ?>
- 20 <div class="card">
- 21 <div class="card-body">
- 22 <div class="alert alert-warning">
- 23 <?php echo htmlspecialchars($lang['login_required'] ?? 'Vous devez être connecté pour créer un paste.', ENT_QUOTES, 'UTF-8'); ?>
- 24 <a href="<?php echo htmlspecialchars($baseurl . 'login.php', ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-primary mt-2">
- 25 <?php echo htmlspecialchars($lang['login'] ?? 'Connexion', ENT_QUOTES, 'UTF-8'); ?>
- 26 </a>
- 27 </div>
- 28 </div>
- 29 </div>
- 30 <?php else: ?>
- 31 <div class="card">
- 32 <div class="card-header">
- 33 <h1><?php echo htmlspecialchars($lang['newpaste'] ?? 'Nouveau paste', ENT_QUOTES, 'UTF-8'); ?></h1>
- 34 <?php
- 35 // Quick diff
- 36 $diffQuickUrl = rtrim($baseurl ?? '/', '/') . '/diff.php?a=oldpaste&b=newpaste';
- 37 ?>
- 38 </div>
- 39 <div class="card-body">
- 40 <?php if (!empty($flash_error)): ?>
- 41 <div class="alert alert-danger"><?php echo htmlspecialchars($flash_error, ENT_QUOTES, 'UTF-8'); ?></div>
- 42 <?php elseif (isset($_GET['error'])): ?>
- 43 <div class="alert alert-warning"><?php echo htmlspecialchars($_GET['error'], ENT_QUOTES, 'UTF-8'); ?></div>
- 44 <?php elseif (isset($_GET['success'])): ?>
- 45 <div class="alert alert-success"><?php echo htmlspecialchars($_GET['success'], ENT_QUOTES, 'UTF-8'); ?></div>
- 46 <?php elseif (isset($error)): ?>
- 47 <div class="alert alert-warning"><?php echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8'); ?></div>
- 48 <?php endif; ?>
- 49
- 50 <form class="form-horizontal" name="mainForm" id="mainForm" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?>" method="POST">
- 51 <div class="row mb-3 g-3">
- 52 <div class="col-sm-4">
- 53 <div class="input-group">
- 54 <span class="input-group-text"><i class="bi bi-fonts"></i></span>
- 55 <input type="text" class="form-control" name="title"
- 56 placeholder="<?php echo htmlspecialchars($lang['pastetitle'] ?? 'Titre du paste', ENT_QUOTES, 'UTF-8'); ?>">
- 57 </div>
- 58 </div>
- 59
- 60 <div class="col-sm-4">
- 61 <select class="form-select" name="format" id="format">
- 62 <?php
- 63 $geshiformats = $geshiformats ?? [];
- 64 $popular_formats = $popular_formats ?? [];
- 65
- 66 // Format sélectionné logic
- 67 if (isset($_POST['format']) && $_POST['format'] !== '') {
- 68 $selectedCode = (string) $_POST['format'];
- 69 } elseif (!empty($paste_data) && !empty($p_code)) {
- 70 $selectedCode = (string) $p_code;
- 71 } else {
- 72 $selectedCode = 'text';
- 73 }
- 74
- 75
- 76 if ($selectedCode !== 'text' && $selectedCode !== 'autodetect' && !array_key_exists($selectedCode, $geshiformats)) {
- 77 $selectedCode = 'text';
- 78 }
- 79
- 80 $isSel = function ($code) use ($selectedCode) {
- 81 return ($selectedCode === $code) ? ' selected="selected"' : '';
- 82 };
- 83
- 84
- 85 echo '<option value="text"' . $isSel('text') . '>Plain Text</option>';
- 86
- 87 echo '<option value="autodetect"' . $isSel('autodetect') . '>Autodetect Language</option>';
- 88
- 89 echo '<option disabled="disabled">-------------------------------------</option>';
- 90
- 91
- 92 foreach ($geshiformats as $code => $name) {
- 93 if ($code === 'text' || $code === 'autodetect') continue;
- 94 if (in_array($code, $popular_formats, true)) {
- 95 echo '<option value="' . htmlspecialchars($code, ENT_QUOTES, 'UTF-8') . '"' . $isSel($code) . '>'
- 96 . htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
- 97 . '</option>';
- 98 }
- 99 }
- 100
- 101
- 102 foreach ($geshiformats as $code => $name) {
- 103 if ($code === 'text' || $code === 'autodetect') continue;
- 104 if (!in_array($code, $popular_formats, true)) {
- 105 echo '<option value="' . htmlspecialchars($code, ENT_QUOTES, 'UTF-8') . '"' . $isSel($code) . '>'
- 106 . htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
- 107 . '</option>';
- 108 }
- 109 }
- 110 ?>
- 111 </select>
- 112 </div>
- 113
- 114 <div class="col-sm-4 d-flex justify-content-end align-items-center gap-2">
- 115 <a class="btn btn-secondary btn-sm" href="<?php echo htmlspecialchars($diffQuickUrl, ENT_QUOTES, 'UTF-8'); ?>" title="<?php echo htmlspecialchars($lang['view_differences'] ?? 'Voir les différences', ENT_QUOTES, 'UTF-8'); ?>"><i class="bi bi-arrow-left-right"></i> .diff</a>
- 116
- 117 <button type="button" class="btn btn-outline-secondary" id="load_file_btn"
- 118 title="<?php echo htmlspecialchars($lang['load_file_no_upload'] ?? 'Charger un fichier dans l’éditeur (sans téléversement)', ENT_QUOTES, 'UTF-8'); ?>">
- 119 <i class="bi bi-upload"></i> <?php echo htmlspecialchars($lang['load'] ?? 'Charger', ENT_QUOTES, 'UTF-8'); ?>
- 120 </button>
- 121
- 122 <button type="button" class="btn btn-outline-secondary" id="clear_file_btn"
- 123 title="<?php echo htmlspecialchars($lang['clear_editor'] ?? 'Vider l’éditeur', ENT_QUOTES, 'UTF-8'); ?>">
- 124 <i class="bi bi-x-circle"></i> <?php echo htmlspecialchars($lang['clear'] ?? 'Vider', ENT_QUOTES, 'UTF-8'); ?>
- 125 </button>
- 126
- 127 <input type="file" id="code_file" class="visually-hidden"
- 128 accept=".txt,.md,.php,.js,.ts,.jsx,.tsx,.py,.rb,.java,.c,.cpp,.h,.cs,.go,.rs,.kt,.swift,.sh,.ps1,.sql,.html,.htm,.css,.scss,.json,.xml,.yml,.yaml,.ini,.conf,text/*">
- 129 </div>
- 130 </div>
- 131
- 132 <div id="file-announce" class="visually-hidden" aria-live="polite"></div>
- 133
- 134 <div class="mb-3">
- 135 <textarea class="form-control" rows="15" id="edit-code" name="paste_data"
- 136 placeholder="<?php echo htmlspecialchars($lang['paste_content'] ?? 'Contenu du paste', ENT_QUOTES, 'UTF-8'); ?>"
- 137 data-max-bytes="<?php echo 1024 * 1024 * ($pastelimit ?? 10); ?>"><?php echo htmlspecialchars($paste_data ?? '', ENT_QUOTES, 'UTF-8'); ?></textarea>
- 138 </div>
- 139
- 140 <div class="row mb-3">
- 141 <label class="col-sm-2 col-form-label"><?php echo htmlspecialchars($lang['expiration'] ?? 'Expiration', ENT_QUOTES, 'UTF-8'); ?></label>
- 142 <div class="col-sm-10">
- 143 <select class="form-select" name="paste_expire_date">
- 144 <option value="N" <?php echo ($paste_expire_date ?? 'N') == "N" ? 'selected' : ''; ?>>Jamais</option>
- 145 <option value="self" <?php echo ($paste_expire_date ?? 'N') == "self" ? 'selected' : ''; ?>>Voir 1 fois</option>
- 146 <option value="10M" <?php echo ($paste_expire_date ?? 'N') == "10M" ? 'selected' : ''; ?>>10 minutes</option>
- 147 <option value="1H" <?php echo ($paste_expire_date ?? 'N') == "1H" ? 'selected' : ''; ?>>1 heure</option>
- 148 <option value="1D" <?php echo ($paste_expire_date ?? 'N') == "1D" ? 'selected' : ''; ?>>1 jour</option>
- 149 <option value="1W" <?php echo ($paste_expire_date ?? 'N') == "1W" ? 'selected' : ''; ?>>1 semaine</option>
- 150 <option value="2W" <?php echo ($paste_expire_date ?? 'N') == "2W" ? 'selected' : ''; ?>>2 semaines</option>
- 151 <option value="1M" <?php echo ($paste_expire_date ?? 'N') == "1M" ? 'selected' : ''; ?>>1 mois</option>
- 152 </select>
- 153 </div>
- 154 </div>
- 155
- 156 <div class="row mb-3">
- 157 <label class="col-sm-2 col-form-label"><?php echo htmlspecialchars($lang['visibility'] ?? 'Visibilité', ENT_QUOTES, 'UTF-8'); ?></label>
- 158 <div class="col-sm-10">
- 159 <select class="form-select" name="visibility">
- 160 <option value="0" <?php echo ($p_visible ?? '1') == "0" ? 'selected' : ''; ?>>
- 161 <?php echo htmlspecialchars($lang['public'] ?? 'Public', ENT_QUOTES, 'UTF-8'); ?>
- 162 </option>
- 163 <option value="1" <?php echo ($p_visible ?? '1') == "1" ? 'selected' : ''; ?>>
- 164 <?php echo htmlspecialchars($lang['unlisted'] ?? 'Non listé', ENT_QUOTES, 'UTF-8'); ?>
- 165 </option>
- 166 <option value="2" <?php echo ($p_visible ?? '1') == "2" ? 'selected' : ''; ?>>
- 167 <?php echo htmlspecialchars($lang['private'] ?? 'Privé', ENT_QUOTES, 'UTF-8'); ?>
- 168 </option>
- 169 </select>
- 170 </div>
- 171 </div>
- 172
- 173 <div class="mb-3">
- 174 <div class="input-group">
- 175 <span class="input-group-text"><i class="bi bi-lock"></i></span>
- 176 <input type="text" class="form-control" name="pass" id="pass"
- 177 placeholder="<?php echo htmlspecialchars($lang['pwopt'] ?? 'Mot de passe (optionnel)', ENT_QUOTES, 'UTF-8'); ?>">
- 178 </div>
- 179 </div>
- 180
- 181 <div class="mb-3 form-check d-none" aria-hidden="true">
- 182 <input type="checkbox" class="form-check-input" id="client_encrypt" name="client_encrypt" value="0" disabled>
- 183 <label class="form-check-label" for="client_encrypt">
- 184 <?php echo htmlspecialchars($lang['client_encrypt_label'] ?? 'Activer le chiffrement côté client (AES-256-GCM)', ENT_QUOTES, 'UTF-8'); ?>
- 185 </label>
- 186 </div>
- 187
- 188 <input type="hidden" name="is_client_encrypted" id="is_client_encrypted" value="0">
- 189
- 190 <div class="modal fade d-none" id="encryptPassModal" tabindex="-1" aria-labelledby="encryptPassLabel" aria-hidden="true">
- 191 <div class="modal-dialog">
- 192 <div class="modal-content">
- 193 <div class="modal-header">
- 194 <h5 class="modal-title" id="encryptPassLabel">
- 195 <?php echo htmlspecialchars($lang['encrypt_modal_title'] ?? 'Définir la phrase de chiffrement', ENT_QUOTES, 'UTF-8'); ?>
- 196 </h5>
- 197 <button type="button" class="btn-close" data-bs-dismiss="modal"
- 198 aria-label="<?php echo htmlspecialchars($lang['close'] ?? 'Fermer', ENT_QUOTES, 'UTF-8'); ?>"></button>
- 199 </div>
- 200
- 201 <div class="modal-body">
- 202 <p><?php echo htmlspecialchars($lang['encrypt_modal_help'] ?? 'Saisissez une phrase secrète robuste (et gardez-la précieusement) :', ENT_QUOTES, 'UTF-8'); ?></p>
- 203
- 204 <div class="input-group mb-3">
- 205 <input type="password" class="form-control" id="encryptPassInput" autocomplete="new-password"
- 206 placeholder="<?php echo htmlspecialchars($lang['encrypt_pass_placeholder'] ?? 'Entrez la phrase secrète', ENT_QUOTES, 'UTF-8'); ?>">
- 207 <button type="button" class="btn btn-outline-secondary" id="toggleEncryptPass"
- 208 title="<?php echo htmlspecialchars($lang['show_hide_password'] ?? 'Afficher / masquer', ENT_QUOTES, 'UTF-8'); ?>">
- 209 <i class="bi bi-eye" id="encryptPassIcon"></i>
- 210 </button>
- 211 </div>
- 212
- 213 <div class="mt-2">
- 214 <div class="progress" style="--height: 5px;">
- 215 <div id="passStrengthBar" class="progress-bar" role="progressbar" style="width: 0%;"></div>
- 216 </div>
- 217 <small id="passStrengthText" class="text-muted">
- 218 <?php echo htmlspecialchars($lang['strength_weak'] ?? 'Force : faible', ENT_QUOTES, 'UTF-8'); ?>
- 219 </small>
- 220 </div>
- 221
- 222 <small class="text-muted d-block mt-1">
- 223 <?php echo htmlspecialchars($lang['encrypt_rules'] ?? '12 caractères minimum ; mélangez majuscules/minuscules, chiffres et symboles.', ENT_QUOTES, 'UTF-8'); ?>
- 224 </small>
- 225 <span class="ms-2">Besoin d'aide ?</span>
- 226 <a href="https://paste.lesalkodiques.info/generatepasswd.php" target="_blank" rel="noopener noreferrer" class="text-decoration-none">Générer une phrase solide</a>
- 227 </div>
- 228
- 229 <div class="modal-footer">
- 230 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
- 231 <?php echo htmlspecialchars($lang['cancel'] ?? 'Annuler', ENT_QUOTES, 'UTF-8'); ?>
- 232 </button>
- 233 <button type="button" class="btn btn-primary" id="encryptConfirm" disabled>
- 234 <?php echo htmlspecialchars($lang['encrypt_btn'] ?? 'Chiffrer', ENT_QUOTES, 'UTF-8'); ?>
- 235 </button>
- 236 </div>
- 237 </div>
- 238 </div>
- 239 </div>
- 240
- 241 <div class="row mb-3">
- 242 <p class="text-muted"><small><?php echo htmlspecialchars($lang['encrypt'] ?? 'Chiffrement', ENT_QUOTES, 'UTF-8'); ?></small></p>
- 243 </div>
- 244
- 245 <?php
- 246 // Debug CAPTCHA condition (console serveur uniquement)
- 247 $captcha_condition = $cap_e == "on" && !isset($_SESSION['username']) && (!isset($disableguest) || $disableguest !== "on");
- 248 error_log("main.php: Condition CAPTCHA : " . ($captcha_condition ? 'vrai' : 'faux'));
- 249 if ($captcha_condition): ?>
- 250 <?php if ($captcha_mode === "recaptcha"): ?>
- 251 <div class="g-recaptcha mb-3" data-theme="dark"
- 252 data-sitekey="<?php echo htmlspecialchars($main_sitekey, ENT_QUOTES, 'UTF-8'); ?>"
- 253 data-callback="onRecaptchaSuccess"></div>
- 254 <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
- 255 <?php elseif ($captcha_mode === "recaptcha_v3"): ?>
- 256 <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
- 257 <?php elseif ($captcha_mode === "turnstile"): ?>
- 258 <div id="turnstile-main" class="cf-turnstile mb-3"
- 259 data-sitekey="<?php echo htmlspecialchars($main_sitekey, ENT_QUOTES, 'UTF-8'); ?>"
- 260 data-callback="onTurnstileSuccess"
- 261 data-action="create_paste"
- 262 data-retry-interval="1000"></div>
- 263 <input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
- 264 <?php else: ?>
- 265 <?php include __DIR__ . '/captcha_bootstrap.php'; ?>
- 266 <?php endif; ?>
- 267 <?php endif; ?>
- 268
- 269 <div class="row mb-3">
- 270 <div class="d-grid gap-2">
- 271 <input class="btn btn-primary paste-button" type="submit" id="submit" data-recaptcha-action="create_paste"
- 272 value="<?php echo htmlspecialchars($lang['createpaste'] ?? 'Créer le paste', ENT_QUOTES, 'UTF-8'); ?>">
- 273 </div>
- 274 </div>
- 275
- 276 </form>
- 277 </div>
- 278 </div>
- 279 <?php endif; ?>
- 280 </div>
- 281
- 282 <div class="col-lg-2 mt-4 mt-lg-0">
- 283 <?php
- 284 $__sidebar = __DIR__ . '/sidebar.php';
- 285 if (is_file($__sidebar)) {
- 286 include $__sidebar;
- 287 }
- 288 ?>
- 289 </div>
- 290 <?php else: ?>
- 291 <div class="col-lg-10">
- 292 <?php if (false): ?>
- 293 <div class="card guest-welcome text-center">
- 294 <div class="btn-group" role="group" aria-label="<?php echo htmlspecialchars($lang['download_paste'] ?? 'Télécharger Paste', ENT_QUOTES, 'UTF-8'); ?>">
- 295 <a href="https://sourceforge.net/projects/phpaste/files/latest/download" class="btn btn-success">
- 296 <?php echo htmlspecialchars($lang['get_paste'] ?? 'Télécharger Paste', ENT_QUOTES, 'UTF-8'); ?> <?=$currentversion?>
- 297 </a>
- 298 <a href="https://github.com/boxlabss/PASTE" class="btn btn-dark">
- 299 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
- 300 <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"></path>
- 301 </svg>
- 302 GitHub
- 303 </a>
- 304 </div>
- 305 </div>
- 306 <?php endif; ?>
- 307
- 308 <?php if (!isset($_SESSION['username']) && ($disableguest === "on")): ?>
- 309 <div class="card">
- 310 <div class="card-body">
- 311 <div class="alert alert-warning">
- 312 <?php echo htmlspecialchars($lang['login_required'] ?? 'Vous devez être connecté pour créer un paste.', ENT_QUOTES, 'UTF-8'); ?>
- 313 <a href="<?php echo htmlspecialchars($baseurl . 'login.php', ENT_QUOTES, 'UTF-8'); ?>" class="btn btn-primary mt-2">
- 314 <?php echo htmlspecialchars($lang['login'] ?? 'Connexion', ENT_QUOTES, 'UTF-8'); ?>
- 315 </a>
- 316 </div>
- 317 </div>
- 318 </div>
- 319 <?php else: ?>
- 320 <div class="card">
- 321 <div class="card-header">
- 322 <h1><?php echo htmlspecialchars($lang['newpaste'] ?? 'Nouveau paste', ENT_QUOTES, 'UTF-8'); ?></h1>
- 323 <?php
- 324 // Quick diff
- 325 $diffQuickUrl = rtrim($baseurl ?? '/', '/') . '/diff.php?a=oldpaste&b=newpaste';
- 326 ?>
- 327 </div>
- 328
- 329 <div class="card-body">
- 330 <?php if (!empty($flash_error)): ?>
- 331 <div class="alert alert-danger"><?php echo htmlspecialchars($flash_error, ENT_QUOTES, 'UTF-8'); ?></div>
- 332 <?php elseif (isset($_GET['error'])): ?>
- 333 <div class="alert alert-warning"><?php echo htmlspecialchars($_GET['error'], ENT_QUOTES, 'UTF-8'); ?></div>
- 334 <?php elseif (isset($_GET['success'])): ?>
- 335 <div class="alert alert-success"><?php echo htmlspecialchars($_GET['success'], ENT_QUOTES, 'UTF-8'); ?></div>
- 336 <?php elseif (isset($error)): ?>
- 337 <div class="alert alert-warning"><?php echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8'); ?></div>
- 338 <?php endif; ?>
- 339
- 340 <form class="form-horizontal" name="mainForm" id="mainForm" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?>" method="POST">
- 341 <div class="row mb-3 g-3">
- 342 <div class="col-sm-4">
- 343 <div class="input-group">
- 344 <span class="input-group-text"><i class="bi bi-fonts"></i></span>
- 345 <input type="text" class="form-control" name="title"
- 346 placeholder="<?php echo htmlspecialchars($lang['pastetitle'] ?? 'Titre du paste', ENT_QUOTES, 'UTF-8'); ?>">
- 347 </div>
- 348 </div>
- 349
- 350 <div class="col-sm-4">
- 351 <select class="form-select" name="format" id="format">
- 352 <?php
- 353 $geshiformats = $geshiformats ?? [];
- 354 $popular_formats = $popular_formats ?? [];
- 355
- 356 // Logique formulaire public
- 357 if (isset($_POST['format']) && $_POST['format'] !== '') {
- 358 $selectedCode = (string) $_POST['format'];
- 359 } elseif (!empty($paste_data) && !empty($p_code)) {
- 360 $selectedCode = (string) $p_code;
- 361 } else {
- 362 $selectedCode = 'text';
- 363 }
- 364
- 365 if ($selectedCode !== 'text' && $selectedCode !== 'autodetect' && !array_key_exists($selectedCode, $geshiformats)) {
- 366 $selectedCode = 'text';
- 367 }
- 368
- 369 $isSel = function ($code) use ($selectedCode) {
- 370 return ($selectedCode === $code) ? ' selected="selected"' : '';
- 371 };
- 372
- 373 echo '<option value="text"' . $isSel('text') . '>Plain Text</option>';
- 374 echo '<option value="autodetect"' . $isSel('autodetect') . '>Autodetect Language</option>';
- 375 echo '<option disabled="disabled">-------------------------------------</option>';
- 376
- 377 foreach ($geshiformats as $code => $name) {
- 378 if ($code === 'text' || $code === 'autodetect') continue;
- 379 if (in_array($code, $popular_formats, true)) {
- 380 echo '<option value="' . htmlspecialchars($code, ENT_QUOTES, 'UTF-8') . '"' . $isSel($code) . '>'
- 381 . htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
- 382 . '</option>';
- 383 }
- 384 }
- 385
- 386 foreach ($geshiformats as $code => $name) {
- 387 if ($code === 'text' || $code === 'autodetect') continue;
- 388 if (!in_array($code, $popular_formats, true)) {
- 389 echo '<option value="' . htmlspecialchars($code, ENT_QUOTES, 'UTF-8') . '"' . $isSel($code) . '>'
- 390 . htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
- 391 . '</option>';
- 392 }
- 393 }
- 394 ?>
- 395 </select>
- 396 </div>
- 397
- 398 <div class="col-sm-4 d-flex justify-content-end align-items-center gap-2">
- 399 <a class="btn btn-secondary btn-lx" href="<?php echo htmlspecialchars($diffQuickUrl, ENT_QUOTES, 'UTF-8'); ?>" title="<?php echo htmlspecialchars($lang['view_differences'] ?? 'Voir les différences', ENT_QUOTES, 'UTF-8'); ?>"><i class="bi bi-arrow-left-right"></i> .diff</a>
- 400
- 401 <button type="button" class="btn btn-outline-secondary" id="load_file_btn"
- 402 title="<?php echo htmlspecialchars($lang['load_file'] ?? 'Charger un fichier dans l’éditeur', ENT_QUOTES, 'UTF-8'); ?>">
- 403 <i class="bi bi-upload"></i> <?php echo htmlspecialchars($lang['load'] ?? 'Charger', ENT_QUOTES, 'UTF-8'); ?>
- 404 </button>
- 405
- 406 <button type="button" class="btn btn-outline-secondary" id="clear_file_btn"
- 407 title="<?php echo htmlspecialchars($lang['clear_editor'] ?? 'Vider l’éditeur', ENT_QUOTES, 'UTF-8'); ?>">
- 408 <i class="bi bi-x-circle"></i> <?php echo htmlspecialchars($lang['clear'] ?? 'Vider', ENT_QUOTES, 'UTF-8'); ?>
- 409 </button>
- 410
- 411 <input type="file" id="code_file" class="visually-hidden"
- 412 accept=".txt,.md,.php,.js,.ts,.jsx,.tsx,.py,.rb,.java,.c,.cpp,.h,.cs,.go,.rs,.kt,.swift,.sh,.ps1,.sql,.html,.htm,.css,.scss,.json,.xml,.yml,.yaml,.ini,.conf,text/*">
- 413 </div>
- 414 </div>
- 415
- 416 <div id="file-announce" class="visually-hidden" aria-live="polite"></div>
- 417
- 418 <div class="mb-3">
- 419 <textarea class="form-control" rows="15" id="edit-code" name="paste_data"
- 420 placeholder="<?php echo htmlspecialchars($lang['paste_content'] ?? 'Contenu du paste', ENT_QUOTES, 'UTF-8'); ?>"
- 421 data-max-bytes="<?php echo 1024 * 1024 * ($pastelimit ?? 10); ?>"><?php echo htmlspecialchars($paste_data ?? '', ENT_QUOTES, 'UTF-8'); ?></textarea>
- 422 </div>
- 423
- 424 <div class="row mb-3">
- 425 <label class="col-sm-2 col-form-label"><?php echo htmlspecialchars($lang['expiration'] ?? 'Expiration', ENT_QUOTES, 'UTF-8'); ?></label>
- 426 <div class="col-sm-10">
- 427 <select class="form-select" name="paste_expire_date">
- 428 <option value="N" <?php echo ($paste_expire_date ?? 'N') == "N" ? 'selected' : ''; ?>>Jamais</option>
- 429 <option value="self" <?php echo ($paste_expire_date ?? 'N') == "self" ? 'selected' : ''; ?>>Voir 1 fois</option>
- 430 <option value="10M" <?php echo ($paste_expire_date ?? 'N') == "10M" ? 'selected' : ''; ?>>10 minutes</option>
- 431 <option value="1H" <?php echo ($paste_expire_date ?? 'N') == "1H" ? 'selected' : ''; ?>>1 heure</option>
- 432 <option value="1D" <?php echo ($paste_expire_date ?? 'N') == "1D" ? 'selected' : ''; ?>>1 jour</option>
- 433 <option value="1W" <?php echo ($paste_expire_date ?? 'N') == "1W" ? 'selected' : ''; ?>>1 semaine</option>
- 434 <option value="2W" <?php echo ($paste_expire_date ?? 'N') == "2W" ? 'selected' : ''; ?>>2 semaines</option>
- 435 <option value="1M" <?php echo ($paste_expire_date ?? 'N') == "1M" ? 'selected' : ''; ?>>1 mois</option>
- 436 </select>
- 437 </div>
- 438 </div>
- 439
- 440 <div class="row mb-3">
- 441 <label class="col-sm-2 col-form-label"><?php echo htmlspecialchars($lang['visibility'] ?? 'Visibilité', ENT_QUOTES, 'UTF-8'); ?></label>
- 442 <div class="col-sm-10">
- 443 <select class="form-select" name="visibility">
- 444 <option value="0" <?php echo ($p_visible ?? '1') == "0" ? 'selected' : ''; ?>>
- 445 <?php echo htmlspecialchars($lang['public'] ?? 'Public', ENT_QUOTES, 'UTF-8'); ?>
- 446 </option>
- 447 <option value="1" <?php echo ($p_visible ?? '1') == "1" ? 'selected' : ''; ?>>
- 448 <?php echo htmlspecialchars($lang['unlisted'] ?? 'Non listé', ENT_QUOTES, 'UTF-8'); ?>
- 449 </option>
- 450 <option value="2" <?php echo ($p_visible ?? '1') == "2" ? 'selected' : ''; ?>>
- 451 <?php echo htmlspecialchars($lang['private'] ?? 'Privé', ENT_QUOTES, 'UTF-8'); ?>
- 452 </option>
- 453 </select>
- 454 </div>
- 455 </div>
- 456
- 457 <div class="mb-3">
- 458 <div class="input-group">
- 459 <span class="input-group-text"><i class="bi bi-lock"></i></span>
- 460 <input type="text" class="form-control" name="pass" id="pass"
- 461 placeholder="<?php echo htmlspecialchars($lang['pwopt'] ?? 'Mot de passe (optionnel)', ENT_QUOTES, 'UTF-8'); ?>">
- 462 </div>
- 463 </div>
- 464
- 465 <div class="mb-3 form-check d-none" aria-hidden="true">
- 466 <input type="checkbox" class="form-check-input" id="client_encrypt" name="client_encrypt" value="0" disabled>
- 467 <label class="form-check-label" for="client_encrypt">
- 468 <?php echo htmlspecialchars($lang['client_encrypt_label'] ?? 'Activer le chiffrement côté client (AES-256-GCM)', ENT_QUOTES, 'UTF-8'); ?>
- 469 </label>
- 470 </div>
- 471
- 472 <input type="hidden" name="is_client_encrypted" id="is_client_encrypted" value="0">
- 473
- 474 <div class="modal fade d-none" id="encryptPassModal" tabindex="-1" aria-labelledby="encryptPassLabel" aria-hidden="true">
- 475 <div class="modal-dialog">
- 476 <div class="modal-content">
- 477 <div class="modal-header">
- 478 <h5 class="modal-title" id="encryptPassLabel">
- 479 <?php echo htmlspecialchars($lang['encrypt_modal_title'] ?? 'Définir la phrase de chiffrement', ENT_QUOTES, 'UTF-8'); ?>
- 480 </h5>
- 481 <button type="button" class="btn-close" data-bs-dismiss="modal"
- 482 aria-label="<?php echo htmlspecialchars($lang['close'] ?? 'Fermer', ENT_QUOTES, 'UTF-8'); ?>"></button>
- 483 </div>
- 484
- 485 <div class="modal-body">
- 486 <p><?php echo htmlspecialchars($lang['encrypt_modal_help'] ?? 'Saisissez une phrase secrète robuste (et gardez-la précieusement) :', ENT_QUOTES, 'UTF-8'); ?></p>
- 487
- 488 <div class="input-group mb-3">
- 489 <input type="password" class="form-control" id="encryptPassInput" autocomplete="new-password"
- 490 placeholder="<?php echo htmlspecialchars($lang['encrypt_pass_placeholder'] ?? 'Entrez la phrase secrète', ENT_QUOTES, 'UTF-8'); ?>">
- 491 <button type="button" class="btn btn-outline-secondary" id="toggleEncryptPass"
- 492 title="<?php echo htmlspecialchars($lang['show_hide_password'] ?? 'Afficher / masquer', ENT_QUOTES, 'UTF-8'); ?>">
- 493 <i class="bi bi-eye" id="encryptPassIcon"></i>
- 494 </button>
- 495 </div>
- 496
- 497 <div class="mt-2">
- 498 <div class="progress" style="--height: 5px;">
- 499 <div id="passStrengthBar" class="progress-bar" role="progressbar" style="width: 0%;"></div>
- 500 </div>
- 501 <small id="passStrengthText" class="text-muted">
- 502 <?php echo htmlspecialchars($lang['strength_weak'] ?? 'Force : faible', ENT_QUOTES, 'UTF-8'); ?>
- 503 </small>
- 504 </div>
- 505
- 506 <small class="text-muted d-block mt-1">
- 507 <?php echo htmlspecialchars($lang['encrypt_rules'] ?? '12 caractères minimum ; mélangez majuscules/minuscules, chiffres et symboles.', ENT_QUOTES, 'UTF-8'); ?>
- 508 </small>
- 509 <span class="ms-2">Besoin d'aide ?</span>
- 510 <a href="https://paste.lesalkodiques.info/generatepasswd.php" target="_blank" rel="noopener noreferrer" class="text-decoration-none">Générer une phrase solide</a>
- 511 </div>
- 512
- 513 <div class="modal-footer">
- 514 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
- 515 <?php echo htmlspecialchars($lang['cancel'] ?? 'Annuler', ENT_QUOTES, 'UTF-8'); ?>
- 516 </button>
- 517 <button type="button" class="btn btn-primary" id="encryptConfirm" disabled>
- 518 <?php echo htmlspecialchars($lang['encrypt_btn'] ?? 'Chiffrer', ENT_QUOTES, 'UTF-8'); ?>
- 519 </button>
- 520 </div>
- 521 </div>
- 522 </div>
- 523 </div>
- 524
- 525 <div class="row mb-3">
- 526 <p class="text-muted"><small><?php echo htmlspecialchars($lang['encrypt'] ?? 'Chiffrement', ENT_QUOTES, 'UTF-8'); ?></small></p>
- 527 </div>
- 528
- 529 <?php
- 530 // Debug CAPTCHA condition (console serveur uniquement)
- 531 $captcha_condition = $cap_e == "on" && !isset($_SESSION['username']) && (!isset($disableguest) || $disableguest !== "on");
- 532 error_log("main.php: Condition CAPTCHA : " . ($captcha_condition ? 'vrai' : 'faux'));
- 533 if ($captcha_condition): ?>
- 534 <?php if ($captcha_mode === "recaptcha"): ?>
- 535 <div class="g-recaptcha mb-3" data-theme="dark"
- 536 data-sitekey="<?php echo htmlspecialchars($main_sitekey, ENT_QUOTES, 'UTF-8'); ?>"
- 537 data-callback="onRecaptchaSuccess"></div>
- 538 <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
- 539 <?php elseif ($captcha_mode === "recaptcha_v3"): ?>
- 540 <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
- 541 <?php elseif ($captcha_mode === "turnstile"): ?>
- 542 <div class="cf-turnstile mb-3"
- 543 data-sitekey="<?php echo htmlspecialchars($main_sitekey, ENT_QUOTES, 'UTF-8'); ?>"
- 544 data-callback="onTurnstileSuccess"
- 545 data-action="create_paste"
- 546 data-appearance="execute"
- 547 data-retry-interval="1000"></div>
- 548 <input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
- 549 <?php else: ?>
- 550 <?php include __DIR__ . '/captcha_bootstrap.php'; ?>
- 551 <?php endif; ?>
- 552 <?php endif; ?>
- 553
- 554 <div class="row mb-3">
- 555 <div class="d-grid gap-2">
- 556 <input class="btn btn-primary paste-button" type="submit" id="submit" data-recaptcha-action="create_paste"
- 557 value="<?php echo htmlspecialchars($lang['createpaste'] ?? 'Créer le paste', ENT_QUOTES, 'UTF-8'); ?>">
- 558 </div>
- 559 </div>
- 560
- 561 </form>
- 562 </div>
- 563 </div>
- 564 <?php endif; ?>
- 565 </div>
- 566
- 567 <div class="col-lg-2 mt-4 mt-lg-0">
- 568 <?php
- 569 $__sidebar = __DIR__ . '/sidebar.php';
- 570 if (is_file($__sidebar)) {
- 571 include $__sidebar;
- 572 }
- 573 ?>
- 574 </div>
- 575 <?php endif; ?>
- 576 </div>
- 577</div>
- 578
- 579
- 580<script nonce="<?php echo htmlspecialchars($nonce, ENT_QUOTES, 'UTF-8'); ?>">
- 581
- 582 document.addEventListener('DOMContentLoaded', function() {
- 583 var cb = document.getElementById('client_encrypt');
- 584 var hid = document.getElementById('is_client_encrypted');
- 585 if (cb) {
- 586 cb.checked = false;
- 587 cb.disabled = true;
- 588 }
- 589 if (hid) {
- 590 hid.value = '0';
- 591 }
- 592 });
- 593</script>