Commit 3f2dd7e1 authored by Dominik Hebeler's avatar Dominik Hebeler

Merge branch '1022-settings-for-blacklisting-pages' into 'development'

Resolve "settings for blacklisting pages"

Closes #1022

See merge request !1701
parents 97bff32e 0de3c9e9
......@@ -22,4 +22,6 @@ npm-debug.log
composer.lock
package-lock.json
local.log
\ No newline at end of file
local.log
browserstack.err
......@@ -56,11 +56,22 @@ class SettingsController extends Controller
$cookies = Cookie::get();
$settingActive = false;
foreach ($cookies as $key => $value) {
if (\starts_with($key, [$fokus . "_engine_", $fokus . "_setting_"])) {
if (\starts_with($key, [$fokus . "_engine_", $fokus . "_setting_"]) || strpos($key, $fokus . '_blpage') === 0) {
$settingActive = true;
}
}
# Reading cookies for black list entries
$blacklist = [];
foreach($cookies as $key => $value){
if(stripos($key, 'blpage') !== false && stripos($key, $fokus) !== false){
$blacklist[$key] = $value;
}
}
# Generating link with set cookies
$cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', $cookies));
return view('settings.index')
->with('title', trans('titles.settings', ['fokus' => $fokusName]))
->with('fokus', $request->input('fokus', ''))
......@@ -69,7 +80,9 @@ class SettingsController extends Controller
->with('sumas', $sumas)
->with('filter', $filters)
->with('settingActive', $settingActive)
->with('url', $url);
->with('url', $url)
->with('blacklist', $blacklist)
->with('cookieLink', $cookieLink);
}
private function getSumas($fokus)
......@@ -232,6 +245,7 @@ class SettingsController extends Controller
Cookie::queue($key, "", 0, $cookiePath, null, false, false);
}
}
$this->clearBlacklist($request);
return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
}
......@@ -268,4 +282,116 @@ class SettingsController extends Controller
}
return redirect($request->input('url', 'https://metager.de'));
}
public function newBlacklist(Request $request)
{
$fokus = $request->input('fokus', '');
$url = $request->input('url', '');
$regexProtocol = '#^([a-z]{0,5}://)?(www.)?#';
$blacklist = preg_filter($regexProtocol, '', $request->input('blacklist'));
if(stripos($blacklist, '/') !== false){
$blacklist = substr($blacklist, 0, stripos($blacklist, '/'));
}
$regexUrl = '#^(\*\.)?[a-z0-9]+(\.[a-z0-9]+)?(\.[a-z0-9]{2,})$#';
if(preg_match($regexUrl, $blacklist) === 1){
$path = \Request::path();
$cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
$cookies = Cookie::get();
$cookieCounter = 0;
$noduplicate = true;
ksort($cookies);
if(!empty($cookies)){
foreach ($cookies as $key => $value) {
if(stripos($key, $fokus . '_blpage') === 0){
if($value === $blacklist){
$noduplicate = false;
break;
}
if((int)(substr($key,strlen($fokus . '_blpage'))) === $cookieCounter){
$cookieCounter++;
}
}
}
}
if($noduplicate && !empty($blacklist) > 0 && strlen($blacklist) <= 255){
$cookieName= $fokus.'_blpage'.$cookieCounter;
Cookie::queue($cookieName, $blacklist, 0, $cookiePath, null, false, false);
}
}
return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
}
public function deleteBlacklist(Request $request)
{
$fokus = $request->input('fokus', '');
$url = $request->input('url', '');
$path = \Request::path();
$cookieKey = $request->input('cookieKey');
$cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
Cookie::queue($cookieKey, "", 0, $cookiePath, null, false, false);
return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
}
public function clearBlacklist(Request $request)
{
//function to clear the whole black list
$fokus = $request->input('fokus', '');
$url = $request->input('url', '');
$path = \Request::path();
$empty = $request->input('empty');
$cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
$cookies = Cookie::get();
foreach($cookies as $key => $value){
if(stripos($key, $fokus . '_blpage') === 0) {
Cookie::queue($key, "", 0, $cookiePath, null, false, false);
}
}
return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url])));
}
public function loadSettings(Request $request)
{
$path = \Request::path();
$cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5);
$sumaFile = MetaGer::getLanguageFile();
$sumaFile = json_decode(file_get_contents($sumaFile), true);
$foki = array_keys($sumaFile['foki']);
$regexUrl = '#^(\*\.)?[a-z0-9]+(\.[a-z0-9]+)?(\.[a-z0-9]{2,})$#';
$cookies = $request->all();
foreach($cookies as $key => $value){
$blpage = false;
foreach($foki as $fokus){
if(strpos($key, $fokus . '_blpage') === 0 && preg_match($regexUrl, $value) === 1){
Cookie::queue($key, $value, 0, $cookiePath, null, false, false);
$blpage = true;
}
}
if($blpage){
continue;
}
foreach($sumaFile['filter']['parameter-filter'] as $suma => $filter){
if($key === $suma && $value === $filter){
Cookie::queue($key, $value, 0, $cookiePath, null, false, false);
}
}
}
return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), url('/')));
}
}
......@@ -5,6 +5,7 @@ namespace App;
use App;
use Cache;
use Carbon;
use Cookie;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis;
use Jenssegers\Agent\Agent;
......@@ -1354,6 +1355,13 @@ class MetaGer
$this->hostBlacklist[] = $blacklistString;
}
}
foreach (Cookie::get() as $key => $value) {
if ((stripos($key, $this->fokus.'_blpage') === 0) && (stripos($value, '*.') === false)) {
$this->hostBlacklist[] = $value;
}
}
$this->hostBlacklist = array_unique($this->hostBlacklist);
// print the host blacklist as a user warning
if (sizeof($this->hostBlacklist) > 0) {
......@@ -1389,6 +1397,14 @@ class MetaGer
$this->domainBlacklist[] = substr($blacklistString, strpos($blacklistString, "*.") + 2);
}
}
foreach (Cookie::get() as $key => $value) {
if (stripos($key, $this->fokus.'_blpage') === 0 && stripos($value, '*.') === 0) {
$this->domainBlacklist[] = str_replace("*.", "", $value);
}
}
$this->domainBlacklist = array_unique($this->domainBlacklist);
// print the domain blacklist as a user warning
if (sizeof($this->domainBlacklist) > 0) {
$domainString = "";
......@@ -1732,9 +1748,14 @@ class MetaGer
$cookies = \Cookie::get();
$count = 0;
$sumaFile = MetaGer::getLanguageFile();
$sumaFile = json_decode(file_get_contents($sumaFile), true);
$foki = array_keys($sumaFile['foki']);
foreach ($cookies as $key => $value) {
if (starts_with($key, [$this->getFokus() . "_setting_", $this->getFokus() . "_engine_"])) {
if (starts_with($key, [$this->getFokus() . "_setting_", $this->getFokus() . "_engine_", $this->getFokus() . "_blpage"])) {
$count++;
continue;
}
}
return $count;
......
<?php
return [
"header.1" => "Sucheinstellungen",
"text.1" => "Hier können Sie dauerhafte Sucheinstellungen für Ihre MetaGer-Suche im Fokus :fokusName vornehmen. Sollten diese nicht dauerhaft gespeichert bleiben, überprüfen Sie bitte in Ihren Browsereinstellungen, ob dieser beim Beenden gespeicherte Cookies löscht.",
'header.1' => 'Sucheinstellungen',
'text.1' => 'Hier können Sie dauerhafte Sucheinstellungen für Ihre MetaGer-Suche im Fokus :fokusName vornehmen. Sollten diese nicht dauerhaft gespeichert bleiben, überprüfen Sie bitte in Ihren Browsereinstellungen, ob dieser beim Beenden gespeicherte Cookies löscht.',
"hint.header" => "Hinweis",
"hint.text" => "Um Ihre Sucheinstellungen zu speichern, verwenden wir nicht-personenbeziehbare Cookies. Diese werden im Klartext in Ihrem Browser gespeichert. Sie können sich eine Übersicht aller von Ihnen vorgenommenen Einstellungen und Cookies <a href=\":link\">anzeigen lassen</a>.",
'hint.header' => 'Hinweis',
'hint.text' => 'Um Ihre Sucheinstellungen zu speichern, verwenden wir nicht-personenbeziehbare Cookies. Diese werden im Klartext in Ihrem Browser gespeichert. Sie können sich eine Übersicht aller von Ihnen vorgenommenen Einstellungen und Cookies <a href=:link>anzeigen lassen</a>.',
'hint.loadSettings' => 'Hier finden Sie einen Link, den Sie als Startseite bzw. Lesezeichen einrichten können um Ihre aktuell gesetzen Einstellungen mitzunehmen. Der Link erstellt beim Aufrufen Cookies mit dem entsprechenden Einstellungen.',
"header.2" => "Verwendete Suchmaschinen",
"text.2" => "Nachfolgend sehen Sie alle für diesen Fokus verfügbaren Suchmaschinen. Mit einem Klick auf den Namen können Sie Ein-/Ausgeschaltet werden. Eingeschaltete Suchmaschinen sind in grün dargestellt. Ausgeschaltete in rot oder grau.",
"disabledByFilter" => "Durch Suchfilter deaktiviert:",
'header.2' => 'Verwendete Suchmaschinen',
'text.2' => 'Nachfolgend sehen Sie alle für diesen Fokus verfügbaren Suchmaschinen. Mit einem Klick auf den Namen können Sie Ein-/Ausgeschaltet werden. Eingeschaltete Suchmaschinen sind in grün dargestellt. Ausgeschaltete in rot oder grau.',
'disabledByFilter' => 'Durch Suchfilter deaktiviert:',
"header.3" => "Suchfilter",
"text.3" => "An dieser Stelle können Sie Suchfilter dauerhaft setzen. Mit der Auswahl eines Suchfilters stehen nur noch Suchmaschinen zur Verfügung, welche diesen Filter unterstützen. Umgekehrt werden auch nur Suchfilter angezeigt, welche von der aktuellen Suchmaschinenauswahl unterstützt werden.",
'header.3' => 'Suchfilter',
'text.3' => 'An dieser Stelle können Sie Suchfilter dauerhaft setzen. Mit der Auswahl eines Suchfilters stehen nur noch Suchmaschinen zur Verfügung, welche diesen Filter unterstützen. Umgekehrt werden auch nur Suchfilter angezeigt, welche von der aktuellen Suchmaschinenauswahl unterstützt werden.',
"save" => "Speichern",
"reset" => "Alle Einstellungen löschen",
"back" => "Zurück zur letzten Seite",
'header.4' => 'Blacklist',
'text.4' => 'Hier können Sie Domains eintragen, welche aus Ihrer Suche ausgeschlossen werden sollen. Wenn Sie alle Subdomains einschließen wollen, starten Sie mit "*.".',
'address' => 'Adresseingabe',
// Translations from the settings overview
'noSettings' => "Aktuell sind keine Einstellungen gesetzt!",
'allSettings.header' => "Auf :root gesetzte Einstellungen",
'allSettings.text' => "Hier finden Sie eine Übersicht aller von Ihnen gesetzten Einstellungen und Cookies. Sie können einzelne Einträge löschen, oder alle entfernen. Bedenken Sie, dass die zugehörigen Einstellungen dann nicht mehr verwendet werden.",
'meaning' => "Bedeutung",
'actions' => "Aktionen",
'save' => 'Speichern',
'reset' => 'Alle Einstellungen löschen',
'back' => 'Zurück zur letzten Seite',
'add' => 'Hinzufügen',
'clear' => 'Blacklist leeren',
'copy' => 'Kopieren',
'engineDisabled' => "Die Suchmaschine :engine wird im Fokus :focus nicht abgefragt.",
'inFocus' => "im Fokus",
'key' => "Ihr Schlüssel für die werbefreie Suche",
'removeCookie' => "Diesen Cookie entfernen",
// Translations from the settings overview
'noSettings' => 'Aktuell sind keine Einstellungen gesetzt!',
'allSettings.header' => 'Auf :root gesetzte Einstellungen',
'allSettings.text' => 'Hier finden Sie eine Übersicht aller von Ihnen gesetzten Einstellungen und Cookies. Sie können einzelne Einträge löschen, oder alle entfernen. Bedenken Sie, dass die zugehörigen Einstellungen dann nicht mehr verwendet werden.',
'meaning' => 'Bedeutung',
'actions' => 'Aktionen',
'engineDisabled' => 'Die Suchmaschine :engine wird im Fokus :focus nicht abgefragt.',
'inFocus' => 'im Fokus',
'key' => 'Ihr Schlüssel für die werbefreie Suche',
'blentry' => 'Blacklisteintrag',
'removeCookie' => 'Diesen Cookie entfernen',
];
......@@ -6,6 +6,7 @@ return [
"hint.header" => "Note",
"hint.text" => "To save your search settings, we use non-personally identifiable cookies. These are saved in clear text in your browser. You can see an <a href=\":link\">overview</a> of all the settings and cookies you have made.",
'hint.loadSettings' => 'Here is a link you can use as startpage or bookmark to keep your current settings. The URL sets your settings as cookies.',
"header.2" => "Used Search Engines",
"text.2" => "Below are all the search engines available for this focus. With a click on the name they can be switched on / off. Used search engines are shown in green. Not used ones in red or gray.",
......@@ -14,9 +15,16 @@ return [
"header.3" => "Search Filters",
"text.3" => "At this point you can set search filters permanently. With the selection of a search filter, only search engines are available that support this filter. Conversely, only search filters are displayed which are supported by the current search engine selection.",
'header.4' => 'Black list',
'text.4' => 'Here you can add domains to exclude when searching. If you want to exclude all subdomains start with "*.".',
'address' => 'Address',
"save" => "Save",
"reset" => "Delete all settings",
"back" => "Back to the last page",
'add' => 'Add',
'clear' => 'Clear black list',
'copy' => 'Copy',
// Translations from the settings overview
'noSettings' => "Currently no settings are set!",
......@@ -29,5 +37,6 @@ return [
'engineDisabled' => "The search engine :engine will not be queried in focus :focus.",
'inFocus' => "in focus",
'key' => "Your key to the ad-free search",
'blentry' => 'Black list entry',
'removeCookie' => "Remove this cookie",
];
......@@ -48,4 +48,49 @@
#no-settings {
text-align: center;
}
#newentry{
#create{
display:flex;
align-items:left;
margin-bottom:10px;
#blacklist{
flex-grow:1;
width:100%;
}
button{
width:200px;
}
}
}
#deleteentry{
table{
border:1px solid lightgray;
flex-grow:1;
width:100%;
}
tr:nth-child(odd){
background-color:rgb(240, 240, 240);
}
tr:nth-child(even){
background-color:rgb(255, 215, 200);
}
td{
padding:10px 0px;
}
td:first-child{
padding-left:5px;
}
td:last-child{
width:20px;
}
}
#cookieLink{
display:flex;
align-items:left;
#loadSettings{
flex-grow:1;
width:100%;
}
}
}
\ No newline at end of file
......@@ -32,6 +32,8 @@
@endforeach
@elseif($key === "key")
@lang('settings.key')
@elseif(strpos($key, "_blpage"))
@lang('settings.blentry')
@endif
</td>
<td>
......
......@@ -11,6 +11,11 @@
<div class="card-light">
<h2>@lang('settings.hint.header')</h2>
<p>@lang('settings.hint.text', ["link" => LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('showAllSettings', ['url' => url()->full()])) ])</p>
<p>@lang('settings.hint.loadSettings')</p>
<div id="cookieLink">
<input id="loadSettings" type="text" value="{{$cookieLink}}">
<button class="js-only btn btn-default" onclick="var copyText = document.getElementById('loadSettings');copyText.select();copyText.setSelectionRange(0, 99999);document.execCommand('copy');">@lang('settings.copy')</button>
</div>
</div>
<div class="card-light">
<h2>@lang('settings.header.2')</h2>
......@@ -82,24 +87,57 @@
</div>
<button type="submit" class="btn btn-default">@lang('settings.save')</button>
</form>
</div>
<div class="card-light" id="blacklist">
<h2>@lang('settings.header.4')</h2>
<p>@lang('settings.text.4')</p>
<form id="newentry" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('newBlacklist', ["fokus" => $fokus, "url" => $url])) }}" method="post">
<input type="hidden" name="url" value="{{ $url }}">
<input type="hidden" name="fokus" value="{{ $fokus }}">
<label for="blacklist">@lang('settings.address')</label>
<div id="create">
<input id="blacklist" name="blacklist" type="text" placeholder="example.com">
<button type="submit" class="btn btn-default">@lang('settings.add')</button>
</div>
</form>
@if(!empty($blacklist))
<form id="deleteentry" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('deleteBlacklist', ["fokus" => $fokus, "url" => $url])) }}" method="post">
<table>
@foreach($blacklist as $key => $value)
<tr>
<td>
{{ $value }}
</td>
<td>
<button type="submit" name="cookieKey" value="{{ $key }}"><i class="fas fa-trash-alt"></i></button>
</td>
</tr>
@endforeach
</table>
</form>
<form id="clearlist" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('clearBlacklist', ["fokus" => $fokus, "url" => $url])) }}" method="post">
<button type="submit" name="clear" value="1">@lang('settings.clear')</button>
</form>
@endif
</div>
@if(LaravelLocalization::getCurrentLocale() === "de")
<div class="card-light">
<h2>Weitere Einstellungen</h2>
<form id="setting-form" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('enableSetting')) }}" method="post" class="form">
<input type="hidden" name="fokus" value="{{ $fokus }}">
<input type="hidden" name="url" value="{{ $url }}">
<div class="form-group">
<label for="zitate">Zitate</label>
<select name="zitate" id="zitate" class="form-control">
<option value="on" @if(Cookie::get($fokus . "_setting_zitate") === null)disabled selected @endif>Anzeigen</option>
<option value="off" {{ Cookie::get($fokus . "_setting_zitate") === "off" ? "disabled selected" : "" }}>Nicht Anzeigen</option>
</select>
<div class="card-light">
<h2>Weitere Einstellungen</h2>
<form id="setting-form" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('enableSetting')) }}" method="post" class="form">
<input type="hidden" name="fokus" value="{{ $fokus }}">
<input type="hidden" name="url" value="{{ $url }}">
<div class="form-group">
<label for="zitate">Zitate</label>
<select name="zitate" id="zitate" class="form-control">
<option value="on" @if(Cookie::get($fokus . "_setting_zitate") === null)disabled selected @endif>Anzeigen</option>
<option value="off" {{ Cookie::get($fokus . "_setting_zitate") === "off" ? "disabled selected" : "" }}>Nicht Anzeigen</option>
</select>
</div>
<button type="submit" class="btn btn-default">@lang('settings.save')</button>
</form>
</div>
<button type="submit" class="btn btn-default">@lang('settings.save')</button>
</form>
</div>
@endif
<div class="card-light" id="actions">
@if($settingActive)
......
......@@ -20,12 +20,15 @@ Route::group(
Route::post('ef', 'SettingsController@enableFilter')->name('enableFilter');
Route::post('es', 'SettingsController@enableSetting')->name('enableSetting');
Route::post('ds', 'SettingsController@deleteSettings')->name('deleteSettings');
Route::post('nb', 'SettingsController@newBlacklist')->name('newBlacklist');
Route::post('db', 'SettingsController@deleteBlacklist')->name('deleteBlacklist');
Route::post('cb', 'SettingsController@clearBlacklist')->name('clearBlacklist');
# Route to show and delete all settings
Route::get('all-settings', 'SettingsController@allSettingsIndex')->name('showAllSettings');
Route::post('all-settings/removeOne', 'SettingsController@removeOneSetting')->name('removeOneSetting');
Route::post('all-settings/removeAll', 'SettingsController@removeAllSettings')->name('removeAllSettings');
Route::get('load-settings', 'SettingsController@loadSettings')->name('loadSettings');
});
}
);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment