keys.php 991 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. <?php declare(strict_types=1);
  2. $el_nb = count($_POST['keys']);
  3. if ($el_nb < 1 OR $el_nb > 8)
  4. output(403, 'Wrong elements number.');
  5. foreach ($_POST['keys'] as $i => $key) {
  6. if (($key['public-key'] ?? '') === '') {
  7. unset($_POST['keys'][$i]);
  8. continue;
  9. }
  10. if (preg_match('#^/[/\p{L}\{M}\p{N}\p{P}\p{S}\p{Zs}]{0,254}$#Du', $key['dir'] ?? '') !== 1)
  11. output(403, _('Path is not valid.'));
  12. if (preg_match('#' . ED25519_PUBKEY_REGEX . '#D', $key['public-key']) !== 1)
  13. output(403, _('Ed25519 public key seems wrongly formatted.'));
  14. }
  15. $keys = array_values($_POST['keys']);
  16. rateLimit();
  17. try {
  18. DB->beginTransaction();
  19. query('delete', 'ssh-keys', ['username' => $_SESSION['id']]);
  20. foreach ($keys as $key)
  21. insert('ssh-keys', [
  22. 'key' => $key['public-key'],
  23. 'username' => $_SESSION['id'],
  24. 'directory' => $key['dir'],
  25. ]);
  26. DB->commit();
  27. } catch (Exception $e) {
  28. DB->rollback();
  29. output(500, 'Database error.', [$e->getMessage()]);
  30. }
  31. output(200, _('SSH keys updated.'));