Merge pull request #3388 from tobiasd/20170424-blocklistadminpanel

blocklist front end for the admin panel
This commit is contained in:
Hypolite Petovan 2017-04-25 21:23:20 -04:00 committed by GitHub
commit 0b8f80c747
3 changed files with 137 additions and 0 deletions

View file

@ -109,6 +109,9 @@ function admin_post(App $a) {
case 'dbsync': case 'dbsync':
admin_page_dbsync_post($a); admin_page_dbsync_post($a);
break; break;
case 'blocklist':
admin_page_blocklist_post($a);
break;
} }
} }
@ -166,6 +169,7 @@ function admin_content(App $a) {
'features' => array("admin/features/", t("Additional features") , "features"), 'features' => array("admin/features/", t("Additional features") , "features"),
'dbsync' => array("admin/dbsync/", t('DB updates'), "dbsync"), 'dbsync' => array("admin/dbsync/", t('DB updates'), "dbsync"),
'queue' => array("admin/queue/", t('Inspect Queue'), "queue"), 'queue' => array("admin/queue/", t('Inspect Queue'), "queue"),
'blocklist' => array("admin/blocklist/", t('Server Blocklist'), "blocklist"),
'federation' => array("admin/federation/", t('Federation Statistics'), "federation"), 'federation' => array("admin/federation/", t('Federation Statistics'), "federation"),
); );
@ -236,6 +240,9 @@ function admin_content(App $a) {
case 'federation': case 'federation':
$o = admin_page_federation($a); $o = admin_page_federation($a);
break; break;
case 'blocklist':
$o = admin_page_blocklist($a);
break;
default: default:
notice(t("Item not found.")); notice(t("Item not found."));
} }
@ -252,6 +259,93 @@ function admin_content(App $a) {
} }
} }
/**
* @brief Subpage to modify the server wide block list via the admin panel.
*
* This function generates the subpage of the admin panel to allow the
* modification of the node wide block/black list to block entire
* remote servers from communication with this node. The page allows
* adding, removing and editing of entries from the blocklist.
*
* @param App $a
* @return string
*/
function admin_page_blocklist(App $a) {
$blocklist = Config::get('system', 'blocklist');
$blocklistform = array();
if (is_array($blocklist)) {
foreach($blocklist as $id => $b) {
$blocklistform[] = array(
'url' => array("url[$id]", t('Blocked URL'), $b['URL'], '', t('The blocked URL'), 'required', '', ''),
'reason' => array("reason[$id]", t("Reason for the block"), $b['reason'], t('The reason why you blocked this URL.').'('.$b['URL'].')', 'required', '', ''),
'delete' => array("delete[$id]", t("Delete UFL").' ('.$b['URL'].')', False , "Check to delete this entry from the blocklist")
);
}
}
$t = get_markup_template("admin_blocklist.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Server Blocklist'),
'$intro' => t('This page can be used to define a black list of servers from the federated network that are not allowed to interact with your node. For all entered URLs you should also give a reason, why you have blocked the remote server.'),
'$public' => t('The list of blocked servers will be made publically available on the /friendica page so that your users and people investigating communication problems can find the reason easily.'),
'$addtitle' => t('Add new entry to block list'),
'$newurl' => array('newentry_url', t('Server URL'), '', t('The URL of the new server to add to the block list. Do not include the protocol to the URL.'), 'required', '', ''),
'$newreason' => array('newentry_reason', t('Block reason'), '', t('The reason why you blocked this URL.'), 'required', '', ''),
'$submit' => t('Add Entry'),
'$savechanges' => t('Save changes to the blocklist'),
'$currenttitle' => t('Current Entries in the Blocklist'),
'$thurl' => t('Blocked URL'),
'$threason' => t('Reason for the block'),
'$delentry' => t('Delete entry from blocklist'),
'$entries' => $blocklistform,
'$baseurl' => App::get_baseurl(true),
'$confirm_delete' => t('Delete entry from blocklist?'),
'$form_security_token' => get_form_security_token("admin_blocklist")
));
}
/**
* @brief Process send data from Admin Blocklist Page
*
* @param App $a
*/
function admin_page_blocklist_post(App $a) {
if (!x($_POST,"page_blocklist_save") && (!x($_POST['page_blocklist_edit']))) {
return;
}
check_form_security_token_redirectOnErr('/admin/blocklist', 'admin_blocklist');
if (x($_POST['page_blocklist_save'])) {
// Add new item to blocklist
$blocklist = get_config('system', 'blocklist');
$blocklist[] = array(
'URL' => notags(trim($_POST['newentry_url'])),
'reason' => notags(trim($_POST['newentry_reason']))
);
Config::set('system', 'blocklist', $blocklist);
info(t('Server added to blocklist.').EOL);
} else {
// Edit the entries from blocklist
$blocklist = array();
foreach ($_POST['url'] as $id => $URL) {
$URL = notags(trim($URL));
$reason = notags(trim($_POST['reason'][$id]));
if (!x($_POST['delete'][$id])) {
$blocklist[] = array(
'URL' => $URL,
'reason' => $reason
);
}
}
Config::set('system', 'blocklist', $blocklist);
info(t('Site blocklist updated.').EOL);
}
goaway('admin/blocklist');
return; // NOTREACHED
}
/** /**
* @brief Subpage with some stats about "the federation" network * @brief Subpage with some stats about "the federation" network
* *

View file

@ -104,6 +104,16 @@ function friendica_content(App $a) {
else else
$o .= '<p>' . t('No installed plugins/addons/apps') . '</p>'; $o .= '<p>' . t('No installed plugins/addons/apps') . '</p>';
$blocklist = Config::get('system', 'blocklist');
if (count($blocklist)) {
$o .= '<div id="about_blocklist"><p>'. t('On this server the following remote servers are blocked.') .'</p>';
$o .= '<table><thead><tr><th>'. t('Blocked URL') .'</th><th>'. t('Reason for the block') .'</th></thead><tbody>';
foreach ($blocklist as $b) {
$o .= '<tr><td>'. $b['URL'] .'</td><td>'. $b['reason'] .'</td></tr>';
}
$o .= '</tbody></table></div>';
}
call_hooks('about_hook', $o); call_hooks('about_hook', $o);
return $o; return $o;

View file

@ -0,0 +1,33 @@
<script>
function confirm_delete(uname){
return confirm("{{$confirm_delete}}".format(uname));
}
</script>
<div id="adminpage">
<h1>{{$title}} - {{$page}}</h1>
<p>{{$intro}}</p>
<p>{{$public}}</p>
<h2>{{$addtitle}}</h2>
<form action="{{$baseurl}}/admin/blocklist" method="post">
<input type="hidden" name="form_security_token" value="{{$form_security_token}}">
{{include file="field_input.tpl" field=$newurl}}
{{include file="field_input.tpl" field=$newreason}}
<div class="submit"><input type="submit" name="page_blocklist_save" value="{{$submit}}" /></div>
</form>
{{if $entries}}
<h2>{{$currenttitle}}</h2>
<p>{{$currentintro}}</p>
<form action="{{$baseurl}}/admin/blocklist" method="post">
<input type="hidden" name="form_security_token" value="{{$form_security_token}}">
{{foreach $entries as $e}}
{{include file="field_input.tpl" field=$e.url}}
{{include file="field_input.tpl" field=$e.reason}}
{{include file="field_checkbox.tpl" field=$e.delete}}
{{/foreach}}
<div class="submit"><input type="submit" name="page_blocklist_edit" value="{{$savechanges}}" /></div>
{{/if}}
</form>
</div>