You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.9 KiB
PHP

<?php
if(is_numeric($router->vars['key'])) {
try {
$pubkey = $pubkey_dir->get_public_key_by_id($router->vars['key']);
} catch(PublicKeyNotFoundException $e) {
require('views/error404.php');
die;
}
} else {
$pubkeys = $pubkey_dir->list_public_keys(array(), array('fingerprint' => $router->vars['key']));
if(count($pubkeys) == 1) {
redirect('/pubkeys/'.urlencode($pubkeys[0]->id));
} elseif(count($pubkeys) > 1) {
redirect('/pubkeys?fingerprint='.urlencode($router->vars['key']));
} else {
require('views/error404.php');
}
exit;
}
$dest_rules = $pubkey->list_destination_rules();
$signatures = $pubkey->list_signatures();
$user_is_owner = false;
switch(get_class($pubkey->owner)) {
case 'User':
$title = 'Public key '.$pubkey->comment.' for '.$pubkey->owner->name;
if($pubkey->owner->uid == $active_user->uid) {
$user_is_owner = true;
}
break;
case 'ServerAccount':
$title = 'Public key '.$pubkey->comment.' for '.$pubkey->owner->name.'@'.$pubkey->owner->server->hostname;
if($active_user->admin_of($pubkey->owner) || $active_user->admin_of($pubkey->owner->server)) {
$user_is_owner = true;
}
break;
default:
require('views/error404.php');
die;
}
if(isset($router->vars['format']) && $router->vars['format'] == 'txt') {
$page = new PageSection('pubkey_txt');
$page->set('pubkey', $pubkey);
header('Content-type: text/plain; charset=utf-8');
echo $page->generate();
} elseif(isset($router->vars['format']) && $router->vars['format'] == 'json') {
$page = new PageSection('pubkey_json');
$page->set('pubkey', $pubkey);
header('Content-type: application/json; charset=utf-8');
echo $page->generate();
} else {
if(isset($_POST['add_signature']) && ($user_is_owner || $active_user->admin)) {
$sig = new PublicKeySignature;
$sig->signature = file_get_contents($_FILES['signature']['tmp_name']);
$sig->public_key = $pubkey;
try {
$pubkey->add_signature($sig);
redirect('#sig');
} catch(InvalidArgumentException $e) {
$content = new PageSection('signature_upload_fail');
switch($e->getMessage()) {
case "Signature doesn't validate against pubkey":
$content->set('message', "The signature you submitted doesn't seem to validate against this public key.");
break;
default:
$content->set('message', "The signature you submitted doesn't look valid.");
}
}
} elseif(isset($_POST['delete_signature']) && ($user_is_owner || $active_user->admin)) {
foreach($signatures as $sig) {
if($sig->id == $_POST['delete_signature']) {
$sig_to_delete = $sig;
}
}
if(isset($sig_to_delete)) {
$pubkey->delete_signature($sig_to_delete);
}
redirect('#sig');
} elseif(isset($_POST['add_dest_rule']) && ($user_is_owner || $active_user->admin)) {
$rule = new PublicKeyDestRule;
$rule->account_name_filter = $_POST['account_name_filter'];
$rule->hostname_filter = $_POST['hostname_filter'];
$pubkey->add_destination_rule($rule);
redirect('#dest');
} elseif(isset($_POST['delete_dest_rule']) && ($user_is_owner || $active_user->admin)) {
foreach($dest_rules as $rule) {
if($rule->id == $_POST['delete_dest_rule']) {
$rule_to_delete = $rule;
}
}
if(isset($rule_to_delete)) {
$pubkey->delete_destination_rule($rule_to_delete);
}
redirect('#dest');
} else {
$content = new PageSection('pubkey');
$content->set('pubkey', $pubkey);
$content->set('admin', $active_user->admin);
$content->set('user_is_owner', $user_is_owner);
$content->set('signatures', $signatures);
$content->set('dest_rules', $dest_rules);
}
$head = '<link rel="alternate" type="application/json" href="'.urlencode($router->vars['key']).'.json" title="JSON for this page">'."\n";
$head .= '<link rel="alternate" type="text/plain" href="'.urlencode($router->vars['key']).'.txt" title="TXT format for this page">'."\n";
$page = new PageSection('base');
$page->set('title', $title);
$page->set('head', $head);
$page->set('content', $content);
$page->set('alerts', $active_user->pop_alerts());
echo $page->generate();
}