Hanno Böck commited on 2025-04-28 14:57:11
Zeige 2 geänderte Dateien mit 16 Einfügungen und 15 Löschungen.
| ... | ... |
@@ -260,7 +260,8 @@ function verify_shell($input) |
| 260 | 260 |
|
| 261 | 261 |
function filter_ssh_key($key) |
| 262 | 262 |
{
|
| 263 |
- $keyparts = explode(" ", trim($key));
|
|
| 263 |
+ $filtered = trim(str_replace(["\r", "\n"], ' ', $key)); |
|
| 264 |
+ $keyparts = explode(" ", $filtered);
|
|
| 264 | 265 |
|
| 265 | 266 |
if ((count($keyparts) > 3) || (count($keyparts) < 2)) {
|
| 266 | 267 |
system_failure("Ungültiger SSH-Key!");
|
| ... | ... |
@@ -283,10 +284,18 @@ function filter_ssh_key($key) |
| 283 | 284 |
} |
| 284 | 285 |
|
| 285 | 286 |
if (count($keyparts) === 2) {
|
| 286 |
- return $keyparts[0] . " " . $keyparts[1]; |
|
| 287 |
+ $fkey = $keyparts[0] . " " . $keyparts[1]; |
|
| 287 | 288 |
} else {
|
| 288 |
- return $keyparts[0] . " " . $keyparts[1] . " " . $keyparts[2]; |
|
| 289 |
+ $fkey = $keyparts[0] . " " . $keyparts[1] . " " . $keyparts[2]; |
|
| 289 | 290 |
} |
| 291 |
+ |
|
| 292 |
+ $sshcmd = proc_open("ssh-keygen -l -f -", [0 => ["pipe", "r"]], $pipes, null, null);
|
|
| 293 |
+ fwrite($pipes[0], $fkey); |
|
| 294 |
+ if (proc_close($sshcmd) !== 0) {
|
|
| 295 |
+ system_failure("Ungültiger SSH-Key laut ssh-keygen!");
|
|
| 296 |
+ } |
|
| 297 |
+ |
|
| 298 |
+ return $fkey; |
|
| 290 | 299 |
} |
| 291 | 300 |
|
| 292 | 301 |
|
| ... | ... |
@@ -14,6 +14,8 @@ Nevertheless, in case you use a significant part of this code, we ask (but not r |
| 14 | 14 |
|
| 15 | 15 |
require_role(ROLE_SYSTEMUSER); |
| 16 | 16 |
|
| 17 |
+require_once("inc/security.php");
|
|
| 18 |
+ |
|
| 17 | 19 |
$data_dir = realpath(dirname(__FILE__) . '/../../../../gitolite-data/'); |
| 18 | 20 |
$config_file = $data_dir . '/gitolite-admin/conf/webinterface.conf'; |
| 19 | 21 |
$config_dir = $data_dir . '/gitolite-admin/conf/webinterface'; |
| ... | ... |
@@ -288,22 +290,12 @@ function newkey($pubkey, $handle) |
| 288 | 290 |
system_failure("Der eingegebene Name enthält ungültige Zeichen. Bitte nur Buchstaben, Zahlen, Unterstrich und Bindestrich benutzen.");
|
| 289 | 291 |
} |
| 290 | 292 |
|
| 291 |
- $pubkey = trim(str_replace(["\r", "\n"], ' ', $pubkey)); |
|
| 293 |
+ DEBUG("checking public key $keyfile");
|
|
| 294 |
+ $pubkey = filter_ssh_key($pubkey); |
|
| 292 | 295 |
|
| 293 | 296 |
$keyfile = $key_dir . '/' . $handle . '.pub'; |
| 294 | 297 |
file_put_contents($keyfile, $pubkey); |
| 295 | 298 |
|
| 296 |
- DEBUG("checking public key $keyfile");
|
|
| 297 |
- $proc = popen("/usr/bin/ssh-keygen -l -f '{$keyfile}' 2>&1", 'r');
|
|
| 298 |
- $output = fread($proc, 512); |
|
| 299 |
- DEBUG($output); |
|
| 300 |
- pclose($proc); |
|
| 301 |
- if (preg_match('/.* is not a public key file.*/', $output)) {
|
|
| 302 |
- unlink($keyfile); |
|
| 303 |
- system_failure('Der angegebene SSH-Key scheint ungültig zu sein.');
|
|
| 304 |
- } |
|
| 305 |
- |
|
| 306 |
- |
|
| 307 | 299 |
git_wrapper('add ' . $keyfile);
|
| 308 | 300 |
|
| 309 | 301 |
$userconfig = $config_dir . '/' . $username . '.conf'; |
| 310 | 302 |