diff --git a/.gitignore b/.gitignore index ce2c62fe06a253c2c0b6c95525cd7a1dbd8ba4e7..46d87d2d30d6167368a3384d68ac433c9645f833 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ Homestead.json Homestead.yaml .env .orig -.vscode langfiles.zip npm-debug.log # The Files created by Webpack in the build process diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 126e341893ea8a72fb737c274a8926541c77e18e..fe648a53adc3a43d236423613c989af32ed1d9cb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,8 +42,11 @@ build: prepare_node: stage: prepare image: node:10 + variables: + npm_config_cache: "$CI_PROJECT_DIR/.npm" before_script: - - npm install + - npm install -g npm-cache + - npm-cache install --cacheDirectory "$CI_PROJECT_DIR/.npm-package-cache" npm script: - npm run prod artifacts: @@ -53,25 +56,28 @@ prepare_node: - public/mix-manifest.json cache: # Cache per Branch - key: "node-$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" + key: "metager-${CI_JOB_NAME}" paths: - - node_modules + - .npm + - .npm-package-cache only: - branches - tags prepare_composer: stage: prepare - image: prooph/composer:7.3 + image: registry.metager.de/open-source/composer/master + variables: + COMPOSER_HOME: "$CI_PROJECT_DIR/.composer" script: - composer install --no-dev artifacts: paths: - vendor cache: - key: "composer-$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" + key: "metager-${CI_JOB_NAME}" paths: - - vendor + - .composer review: variables: diff --git a/.gitlab/development-values.yaml b/.gitlab/development-values.yaml index fd4bf6adef22ea3a93cb950483c495e392bfd2e3..4082c9baf9c2227ba61bfe27b76c8ad042a6afad 100644 --- a/.gitlab/development-values.yaml +++ b/.gitlab/development-values.yaml @@ -27,10 +27,14 @@ resourcesFetcher: cpu: 500m memory: 100M limits: +resources: + requests: + cpu: 500m + memory: 500M podDisruptionBudget: enabled: true - minAvailable: - maxUnavailable: 0 + minAvailable: 1 + maxUnavailable: podAnnotations: prometheus.io/scrape: "true" prometheus.io/path: /metrics diff --git a/.gitlab/production-values.yaml b/.gitlab/production-values.yaml index bdc9fb84de196d139abdf71cea97f79be2db2804..c2ab6cb44de47ad1d503faef53eb0b18367a8f4e 100644 --- a/.gitlab/production-values.yaml +++ b/.gitlab/production-values.yaml @@ -9,8 +9,8 @@ hpa: maxReplicas: 100 podDisruptionBudget: enabled: true - minAvailable: - maxUnavailable: 0 + minAvailable: 3 + maxUnavailable: podAnnotations: prometheus.io/scrape: "true" prometheus.io/path: /metrics @@ -39,6 +39,10 @@ resourcesFetcher: cpu: 500m memory: 100M limits: +resources: + requests: + cpu: 500m + memory: 500M ingress: annotations: cert-manager.io/cluster-issuer: letsencrypt-prod diff --git a/.gitlab/review-apps-values.yaml b/.gitlab/review-apps-values.yaml index a8a7331ba3b28d881b56dc6845c2124779a058b2..39675d18a11ea100f328d62b50fe08e84869cff3 100644 --- a/.gitlab/review-apps-values.yaml +++ b/.gitlab/review-apps-values.yaml @@ -36,4 +36,4 @@ resourcesRedis: limits: resourcesFetcher: requests: - limits: \ No newline at end of file + limits: diff --git a/.gitlab/service_desk_templates/new_note.md b/.gitlab/service_desk_templates/new_note.md new file mode 100644 index 0000000000000000000000000000000000000000..357a3bcd3d0fa4ce9750e523362062f1a0d36ee6 --- /dev/null +++ b/.gitlab/service_desk_templates/new_note.md @@ -0,0 +1,4 @@ +%{NOTE_TEXT} +Team SUMA-EV & MetaGer, Röselerstraße 3, 30159 Hannover +Tel.: +4951134000070, E-Mail: support@suma-ev.de, Fax: +4951134001023 +[suma-ev.de](https://suma-ev.de) & [metager.de](https://metager.de) diff --git a/.gitlab/service_desk_templates/thank_you.md b/.gitlab/service_desk_templates/thank_you.md new file mode 100644 index 0000000000000000000000000000000000000000..b61b3b72a4a1683cf94655e9e68ec75daccd6486 --- /dev/null +++ b/.gitlab/service_desk_templates/thank_you.md @@ -0,0 +1,10 @@ +vielen Dank für Ihre Kontaktaufnahme. Wie Sie vielleicht schon vermuten ist dies zunächst lediglich eine automatisch generierte Antwort, in der wir über unseren Datenschutz aufklären. In unserer [Datenschutzerklärung](https://metager.de/datenschutz#contact) können Sie mehr darüber erfahren, wie lange wir Daten über unsere Konversation aufbewahren und welche Daten überhaupt anfallen. +Ein Mitarbeiter wird sich aber möglichst schnell mit Ihrem Anliegen befassen. + +##### English Version +Thank you for contacting us. As you might already suspect, this is initially just an automatically generated answer in which we explain our data protection. In our [data protection declaration](https://metager.org/datenschutz#contact) you can find out more about how long we keep data about our conversation and what data is actually generated. +However, an employee will deal with your request as quickly as possible. + +Team SUMA-EV & MetaGer, Röselerstraße 3, 30159 Hannover +Tel.: +4951134000070, E-Mail: support@suma-ev.de, Fax: +4951134001023 +[suma-ev.de](https://suma-ev.de) & [metager.de](https://metager.de) diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000000000000000000000000000000000..7987693b275ab4e9e2834defffbf52c763a061ef --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "PHP - Listen for XDebug", + "type": "php", + "request": "launch", + "port": 9000, + "pathMappings": { + "/html": "${workspaceRoot}" + } + }, + { + "name": "PHP - Launch currently open script", + "type": "php", + "request": "launch", + "port": 9000, + "program": "${file}", + "cwd": "${fileDirname}", + "pathMappings": { + "/html": "${workspaceRoot}" + } + } + ] +} \ No newline at end of file diff --git a/DockerfileDev b/DockerfileDev index 04cf4b666512d26a43bf2aabdc291055a734d6e4..af73db666ebcf92c8ccebe2f9028f3ff9b86b1c3 100644 --- a/DockerfileDev +++ b/DockerfileDev @@ -24,6 +24,7 @@ RUN apk add --update \ php7-json \ php7-pcntl \ php7-fileinfo \ + php7-xdebug \ && rm -rf /var/cache/apk/* WORKDIR /html @@ -31,7 +32,7 @@ WORKDIR /html RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stderr/g' /etc/php7/php-fpm.conf && \ sed -i 's/;daemonize = yes/daemonize = no/g' /etc/php7/php-fpm.conf && \ sed -i 's/listen = 127.0.0.1:9000/listen = 9000/g' /etc/php7/php-fpm.d/www.conf && \ - sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 30/g' /etc/php7/php-fpm.d/www.conf && \ + sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 900/g' /etc/php7/php-fpm.d/www.conf && \ sed -i 's/;request_terminate_timeout_track_finished = no/request_terminate_timeout_track_finished = yes/g' /etc/php7/php-fpm.d/www.conf && \ sed -i 's/;decorate_workers_output = no/decorate_workers_output = no/g' /etc/php7/php-fpm.d/www.conf && \ sed -i 's/;catch_workers_output = yes/catch_workers_output = yes/g' /etc/php7/php-fpm.d/www.conf && \ @@ -45,6 +46,11 @@ RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stderr/g' /et sed -i 's/group = www-data/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \ sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php7/php.ini && \ sed -i 's/expose_php = On/expose_php = Off/g' /etc/php7/php.ini && \ + sed -i 's/;zend_extension=xdebug.so/zend_extension=xdebug.so/g' /etc/php7/conf.d/xdebug.ini && \ + echo "xdebug.remote_enable = 1" >> /etc/php7/conf.d/xdebug.ini && \ + echo "xdebug.remote_autostart = 1" >> /etc/php7/conf.d/xdebug.ini && \ + echo "xdebug.remote_connect_back = 1" >> /etc/php7/conf.d/xdebug.ini && \ + echo "xdebug.idekey=VSCODE" >> /etc/php7/conf.d/xdebug.ini && \ echo "daemonize yes" >> /etc/redis.conf && \ ln -s /dev/null /var/log/nginx/access.log && \ ln -s /dev/stdout /var/log/nginx/error.log && \ diff --git a/app/Console/Commands/RequestFetcher.php b/app/Console/Commands/RequestFetcher.php index 270d8bd47d4734ae455f1cf69f535a3bee19bb1d..d36f91163cee7baa142b1cf882c655fcdfef863f 100644 --- a/app/Console/Commands/RequestFetcher.php +++ b/app/Console/Commands/RequestFetcher.php @@ -198,6 +198,10 @@ class RequestFetcher extends Command CURLOPT_TIMEOUT => 7, )); + if (!empty($job["curlopts"])) { + curl_setopt_array($ch, $job["curlopts"]); + } + if (!empty($this->proxyhost) && !empty($this->proxyport) && !empty($this->proxyuser) && !empty($this->proxypassword)) { curl_setopt($ch, CURLOPT_PROXY, $this->proxyhost); curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->proxyuser . ":" . $this->proxypassword); diff --git a/app/Http/Controllers/AdminInterface.php b/app/Http/Controllers/AdminInterface.php index 19efccc428cd5eba19e096f1b4e1ee06ec9f6afd..dd14d95d868424f9e6e04fdcff6f14011cec79bc 100644 --- a/app/Http/Controllers/AdminInterface.php +++ b/app/Http/Controllers/AdminInterface.php @@ -142,11 +142,19 @@ class AdminInterface extends Controller $rekordTagDate = ""; $size = 0; $count = 0; + $logToday = 0; foreach ($logs as $key => $stats) { if ($key === 0) { // Log for today - $logToday = empty($stats->insgesamt->{$interface}) ? 0 : $stats->insgesamt->{$interface}; + $now = Carbon::now(); + $now->hour = 0; + $now->minute = 0; + $now->second = 0; + while ($now->lessThanOrEqualTo(Carbon::now()->subMinutes(5))) { + $logToday += empty($stats->time->{$now->format('H:i')}->{$interface}) ? 0 : $stats->time->{$now->format('H:i')}->{$interface}; + $now->addMinutes(5); + } continue; } $insgesamt = empty($stats->insgesamt->{$interface}) ? 0 : $stats->insgesamt->{$interface}; @@ -156,7 +164,7 @@ class AdminInterface extends Controller $now->minute = 0; $now->second = 0; - while ($now->lessThanOrEqualTo(Carbon::now())) { + while ($now->lessThanOrEqualTo(Carbon::now()->subMinutes(5))) { $sameTime += empty($stats->time->{$now->format('H:i')}->{$interface}) ? 0 : $stats->time->{$now->format('H:i')}->{$interface}; $now->addMinutes(5); } @@ -190,7 +198,7 @@ class AdminInterface extends Controller $sum += ($logToday - $sameTime); } } - + $averageIncrease = 0; if (sizeof($sameTimes) > 0) { $averageIncrease = $sum / sizeof($sameTimes); diff --git a/app/Http/Controllers/KeyController.php b/app/Http/Controllers/KeyController.php index f9f36a49c27a1ab5d2f7cbba69d31c54076bbd8b..4cdd3542688a7a85a25c13d0581070974e7b8abc 100644 --- a/app/Http/Controllers/KeyController.php +++ b/app/Http/Controllers/KeyController.php @@ -5,72 +5,66 @@ namespace App\Http\Controllers; use Cookie; use Illuminate\Http\Request; use LaravelLocalization; +use \App\Models\Key; class KeyController extends Controller { public function index(Request $request) { $redirUrl = $request->input('redirUrl', ""); + $cookie = Cookie::get('key'); + $key = $request->input('keyToSet', ''); - return view('key') - ->with('title', trans('titles.key')); + if (empty($key) && empty($cookie)) { + $key = 'enter_key_here'; + } elseif (empty($key) && !empty($cookie)) { + $key = $cookie; + } elseif (!empty($key)) { + $key = $request->input('key'); + } + $cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', Cookie::get())); + return view('key') + ->with('title', trans('titles.key')) + ->with('cookie', $key) + ->with('cookieLink', $cookieLink); } public function setKey(Request $request) { $redirUrl = $request->input('redirUrl', ""); - $key = $request->input('key', ''); + $keyToSet = $request->input('keyToSet'); + $key = new Key($request->input('keyToSet', '')); - if ($this->authorizeKey($key)) { + if ($key->getStatus()) { # Valid Key $host = $request->header("X_Forwarded_Host", ""); if (empty($host)) { $host = $request->header("Host", ""); } - - Cookie::queue('key', $key, 525600, '/', null, false, false); - return redirect($redirUrl); + Cookie::queue('key', $keyToSet, 525600, '/', null, false, false); + $settings = Cookie::get(); + $settings['key'] = $keyToSet; + $cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', $settings)); + return view('key') + ->with('title', trans('titles.key')) + ->with('cookie', $keyToSet) + ->with('cookieLink', $cookieLink); } else { + $cookieLink = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('loadSettings', Cookie::get())); return view('key') ->with('title', trans('titles.key')) - ->with('keyValid', false); + ->with('keyValid', false) + ->with('cookie', 'enter_key_here') + ->with('cookieLink', $cookieLink); } } public function removeKey(Request $request) { $redirUrl = $request->input('redirUrl', ""); - Cookie::queue('key', '', 0, '/', null, false, false); + Cookie::queue(Cookie::forget('key')); $url = LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), action('KeyController@index', ['redirUrl' => $redirUrl])); return redirect($url); } - - private function authorizeKey($key) - { - $postdata = http_build_query(array( - 'dummy' => rand(), - )); - $opts = array('http' => array( - 'method' => 'POST', - 'header' => 'Content-type: application/x-www-form-urlencoded', - 'content' => $postdata, - ), - ); - - $context = stream_context_create($opts); - - try { - $link = "https://key.metager3.de/" . urlencode($key) . "/request-permission/api-access"; - $result = json_decode(file_get_contents($link, false, $context)); - if ($result->{'api-access'} == true) { - return true; - } else { - return false; - } - } catch (\ErrorException $e) { - return false; - } - - } } diff --git a/app/Http/Controllers/MetaGerSearch.php b/app/Http/Controllers/MetaGerSearch.php index dbc9c50dd124adf5603732e73754c7ddf1daac07..032d739bdd2a8d0c2fcdd33a8fa08e10008eb1bd 100644 --- a/app/Http/Controllers/MetaGerSearch.php +++ b/app/Http/Controllers/MetaGerSearch.php @@ -88,9 +88,13 @@ class MetaGerSearch extends Controller $metager->startSearch($timings); # Versuchen die Ergebnisse der Quicktips zu laden - $quicktipResults = $quicktips->loadResults(); - if (!empty($timings)) { - $timings["Loaded Quicktip Results"] = microtime(true) - $time; + if($quicktips !== null) { + $quicktipResults = $quicktips->loadResults(); + if (!empty($timings)) { + $timings["Loaded Quicktip Results"] = microtime(true) - $time; + } + } else { + $quicktipResults = []; } $metager->waitForMainResults(); @@ -119,7 +123,6 @@ class MetaGerSearch extends Controller $engine->markNew(); } } - try { Cache::put("loader_" . $metager->getSearchUid(), [ "metager" => [ @@ -223,7 +226,7 @@ class MetaGerSearch extends Controller $metager->setAdgoalLoaded($adgoal["loaded"]); $metager->setAdgoalHash($adgoal["adgoalHash"]); - $metager->parseFormData($request); + $metager->parseFormData($request, false); # Nach Spezialsuchen überprüfen: $metager->checkSpecialSearches($request); $metager->restoreEngines($engines); diff --git a/app/Http/Controllers/ServiceDesk.php b/app/Http/Controllers/ServiceDesk.php new file mode 100644 index 0000000000000000000000000000000000000000..48a83799ded21744f6e9bdbbe2f826d51669cf5a --- /dev/null +++ b/app/Http/Controllers/ServiceDesk.php @@ -0,0 +1,48 @@ +<?php + +namespace App\Http\Controllers; + +use Illuminate\Http\Request; +use Log; +use Carbon; + +class ServiceDesk extends Controller +{ + private $accessToken = null; + private $apiUrl = "https://gitlab.metager.de/api/v4/projects"; + + public function webhook(Request $request) + { + // Validate Token match + $token = $request->header("X-Gitlab-Token"); + if ($token !== env("gitlab_webhook_token", "")) { + Log::info("Webhook Action not taken. Token mismatch: " . $token); + return; + } + $this->accessToken = env("gitlab_access_token", ""); + + $event = json_decode($request->getContent(), true); + + if ($event["user"]["username"] === "support-bot" && $event["issue"]["author_id"] === 301 && $event["issue"]["state"] === "closed") { + $closedAt = new Carbon($event["issue"]["closed_at"]); + $createdAt = new Carbon($event["object_attributes"]["created_at"]); + if ($createdAt->isAfter($closedAt)) { + // Reopen the issues + $getParameter = [ + "state_event" => "reopen" + ]; + $url = $this->apiUrl . "/2/issues/" . $event["issue"]["iid"] . "?" . http_build_query($getParameter); + + $response = file_get_contents($url, false, stream_context_create([ + "http" => [ + "method" => "PUT", + "header" => "Authorization: Bearer " . $this->accessToken . "\r\n" + ] + ])); + Log::info("reopened issue " . $event["issue"]["iid"]); + } + } + + return response(""); + } +} diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 03b6629eb018cc996e9a76f2feee5cfde7fdb0fb..8a637a2a1e42d465a825e4a190828c8064f77c52 100644 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Cookie; use LaravelLocalization; use \App\MetaGer; +use \App\Models\Key; use \Illuminate\Http\Request; class SettingsController extends Controller @@ -46,7 +47,6 @@ class SettingsController extends Controller $filters[$name]->values->$key = $values->$key; } } - } } @@ -56,15 +56,15 @@ class SettingsController extends Controller $cookies = Cookie::get(); $settingActive = false; foreach ($cookies as $key => $value) { - if (\starts_with($key, [$fokus . "_engine_", $fokus . "_setting_"]) || strpos($key, $fokus . '_blpage') === 0 || $key === 'dark_mode') { + if (\starts_with($key, [$fokus . "_engine_", $fokus . "_setting_"]) || strpos($key, $fokus . '_blpage') === 0 || $key === 'dark_mode' || $key === 'new_tab' || $key === 'key' || $key === 'zitate') { $settingActive = true; } } # Reading cookies for black list entries $blacklist = []; - foreach($cookies as $key => $value){ - if(stripos($key, 'blpage') !== false && stripos($key, $fokus) !== false){ + foreach ($cookies as $key => $value) { + if (stripos($key, 'blpage') !== false && stripos($key, $fokus) !== false) { $blacklist[$key] = $value; } } @@ -147,7 +147,6 @@ class SettingsController extends Controller } return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url]))); - } public function enableSearchEngine(Request $request) @@ -163,11 +162,10 @@ class SettingsController extends Controller if (Cookie::get($fokus . "_engine_" . $suma) !== null) { $path = \Request::path(); $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); - Cookie::queue($fokus . "_engine_" . $suma, "", 0, $cookiePath, null, false, false); + Cookie::queue($fokus . "_engine_" . $suma, "", 525600, $cookiePath, null, false, false); } return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url]))); - } public function enableFilter(Request $request) @@ -202,38 +200,42 @@ class SettingsController extends Controller } return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url]))); - } - public function enableSetting(Request $request) { + public function enableSetting(Request $request) + { $fokus = $request->input('fokus', ''); $url = $request->input('url', ''); // Currently only the setting for quotes is supported $quotes = $request->input('zitate', ''); - if(!empty($quotes)){ - if($quotes === "off"){ - $path = \Request::path(); - $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); - Cookie::queue($fokus . "_setting_zitate", "off", 0, $cookiePath, null, false, false); - }elseif($quotes === "on") { - $path = \Request::path(); - $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); - Cookie::queue($fokus . "_setting_zitate", "", 0, $cookiePath, null, false, false); + if (!empty($quotes)) { + if ($quotes === "off") { + Cookie::queue('zitate', 'off', 525600, '/', null, false, false); + } elseif ($quotes === "on") { + Cookie::queue('zitate', '', 0, '/', null, false, false); } } $darkmode = $request->input('dm'); - if(!empty($darkmode)){ - if($darkmode === "off"){ - Cookie::queue('dark_mode', '1', 0, '/', null, false, false); - }elseif($darkmode === "on") { - Cookie::queue('dark_mode', '2', 0, '/', null, false, false); - }elseif($darkmode === "system"){ + if (!empty($darkmode)) { + if ($darkmode === "off") { + Cookie::queue('dark_mode', '1', 525600, '/', null, false, false); + } elseif ($darkmode === "on") { + Cookie::queue('dark_mode', '2', 525600, '/', null, false, false); + } elseif ($darkmode === "system") { Cookie::queue('dark_mode', '', 0, '/', null, false, false); } } + $newTab = $request->input('nt'); + if (!empty($newTab)) { + if ($newTab === "off") { + Cookie::queue('new_tab', '', 0, '/', null, false, false); + } elseif ($newTab === "on") { + Cookie::queue('new_tab', 'on', 525600, '/', null, false, false); + } + } return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url]))); } @@ -253,10 +255,18 @@ class SettingsController extends Controller $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); Cookie::queue($key, "", 0, $cookiePath, null, false, false); } - if($key === 'dark_mode'){ + if ($key === 'dark_mode') { + Cookie::queue($key, "", 0, '/', null, false, false); + } + if ($key === 'new_tab') { + Cookie::queue($key, "", 0, '/', null, false, false); + } + if ($key === 'key') { + Cookie::queue($key, "", 0, '/', null, false, false); + } + if ($key === 'zitate') { Cookie::queue($key, "", 0, '/', null, false, false); } - } $this->clearBlacklist($request); @@ -279,13 +289,18 @@ class SettingsController extends Controller $key = $request->input('key', ''); $path = \Request::path(); $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); - if($key === 'dark_mode'){ + if ($key === 'dark_mode') { + Cookie::queue($key, "", 0, '/', null, false, false); + } elseif ($key === 'new_tab') { + Cookie::queue($key, "", 0, '/', null, false, false); + } elseif ($key === 'key') { Cookie::queue($key, "", 0, '/', null, false, false); - }else{ + } elseif ($key === 'zitate') { + Cookie::queue($key, "", 0, '/', null, false, false); + } else { Cookie::queue($key, "", 0, $cookiePath, null, false, false); } return redirect($request->input('url', 'https://metager.de')); - } public function removeAllSettings(Request $request) @@ -294,9 +309,15 @@ class SettingsController extends Controller $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); foreach (Cookie::get() as $key => $value) { - if($key === 'dark_mode'){ - Cookie::queue($key, "", 0, '/', null, false, false); - }else{ + if ($key === 'dark_mode') { + Cookie::queue($key, "", 0, '/', null, false, false); + } elseif ($key === 'new_tab') { + Cookie::queue($key, "", 0, '/', null, false, false); + } elseif ($key === 'key') { + Cookie::queue($key, "", 0, '/', null, false, false); + } elseif ($key === 'zitate') { + Cookie::queue($key, "", 0, '/', null, false, false); + } else { Cookie::queue($key, "", 0, $cookiePath, null, false, false); } } @@ -311,13 +332,12 @@ class SettingsController extends Controller $regexProtocol = '#^([a-z]{0,5}://)?(www.)?#'; $blacklist = preg_filter($regexProtocol, '', $request->input('blacklist')); - if(stripos($blacklist, '/') !== false){ + 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){ - + if (preg_match($regexUrl, $blacklist) === 1) { $path = \Request::path(); $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); $cookies = Cookie::get(); @@ -326,22 +346,22 @@ class SettingsController extends Controller ksort($cookies); - if(!empty($cookies)){ + if (!empty($cookies)) { foreach ($cookies as $key => $value) { - if(stripos($key, $fokus . '_blpage') === 0){ - if($value === $blacklist){ + if (stripos($key, $fokus . '_blpage') === 0) { + if ($value === $blacklist) { $noduplicate = false; break; } - if((int)(substr($key,strlen($fokus . '_blpage'))) === $cookieCounter){ + if ((int)(substr($key, strlen($fokus . '_blpage'))) === $cookieCounter) { $cookieCounter++; } } } } - if($noduplicate && !empty($blacklist) > 0 && strlen($blacklist) <= 255){ + if ($noduplicate && !empty($blacklist) > 0 && strlen($blacklist) <= 255) { $cookieName= $fokus.'_blpage'.$cookieCounter; - Cookie::queue($cookieName, $blacklist, 0, $cookiePath, null, false, false); + Cookie::queue($cookieName, $blacklist, 525600, $cookiePath, null, false, false); } } return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route('settings', ["fokus" => $fokus, "url" => $url]))); @@ -370,8 +390,8 @@ class SettingsController extends Controller $cookiePath = "/" . substr($path, 0, strpos($path, "meta/") + 5); $cookies = Cookie::get(); - foreach($cookies as $key => $value){ - if(stripos($key, $fokus . '_blpage') === 0) { + foreach ($cookies as $key => $value) { + if (stripos($key, $fokus . '_blpage') === 0) { Cookie::queue($key, "", 0, $cookiePath, null, false, false); } } @@ -381,40 +401,50 @@ class SettingsController extends Controller 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,})$#'; + $langFile = MetaGer::getLanguageFile(); + $langFile = json_decode(file_get_contents($langFile)); + $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; + $settings = $request->all(); + foreach ($settings as $key => $value) { + if ($key === 'key') { + $memberKey = new Key($value); + if ($memberKey->getStatus()) { + Cookie::queue($key, $value, 525600, '/', null, false, false); } - } - if($blpage){ - continue; - } - if($key === 'dark_mode'){ - Cookie::queue($key, $value, 0, '/', null, false, false); - } - foreach($sumaFile['filter']['parameter-filter'] as $suma => $filter){ - if($key === $suma && $value === $filter){ - Cookie::queue($key, $value, 0, $cookiePath, null, false, false); + } elseif ($key === 'dark_mode' && ($value === '1' || $value === '2')) { + Cookie::queue($key, $value, 525600, '/', null, false, false); + } elseif ($key === 'new_tab' && $value === 'on') { + Cookie::queue($key, 'on', 525600, '/', null, false, false); + } elseif ($key === 'zitate' && $value === 'off') { + Cookie::queue($key, 'off', 525600, '/', null, false, false); + } else { + foreach ($langFile->foki as $fokus => $fokusInfo) { + if (strpos($key, $fokus . '_blpage') === 0 && preg_match($regexUrl, $value) === 1) { + Cookie::queue($key, $value, 525600, $cookiePath, null, false, false); + } elseif (strpos($key, $fokus.'_setting_') === 0) { + foreach ($langFile->filter->{'parameter-filter'} as $parameter) { + foreach ($parameter->values as $p => $v) { + if ($key === $fokus.'_setting_' . $parameter->{'get-parameter'} && $value === $p) { + Cookie::queue($key, $value, 525600, $cookiePath, null, false, false); + } + } + } + } else { + $sumalist = array_keys($this->getSumas($fokus)); + foreach ($sumalist as $suma) { + if (strpos($key, $fokus . '_engine_' . $suma) === 0) { + Cookie::queue($key, 'off', 525600, $cookiePath, null, false, false); + } + } + } } - } } - return redirect(LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), url('/'))); } } diff --git a/app/Http/Controllers/Stresstest.php b/app/Http/Controllers/Stresstest.php new file mode 100644 index 0000000000000000000000000000000000000000..a4114a8c6c4c9f7766c78c55a406ead2d65aa7f0 --- /dev/null +++ b/app/Http/Controllers/Stresstest.php @@ -0,0 +1,31 @@ +<?php + +namespace App\Http\Controllers; + +use App; +use App\MetaGer; +use Cache; +use Illuminate\Http\Request; +use LaravelLocalization; +use Log; +use View; + +/* The controller uses the MetaGers dummy engine ( documentation: https:\/\/gitlab.metager.de\/open-source\/dummy-engine ) +* to generate a list of test results for stress testing purposes at "/admin/stress". +* For local testing go to config/stress.json and change sumas->dummy->host to "dummy-nginx". +* To activate browser and human verfication use the following route: "/admin/stress/verify". +*/ +class Stresstest extends MetaGerSearch +{ + public function index(Request $request, MetaGer $metager, $timing = false) + { + # adds / replaces query input with a random string to avoid cached results + $request->merge(["eingabe" => "test" . rand()]); + + # deactivates adgoal + $metager->setDummy(true); + $metager->setAdgoalHash(true); + + parent::search($request, $metager, $timing); + } +} \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index cb14ae7025a3077233dfb5cd09cd401242a20a52..e5eb7fc686bc6c83efc1d401d68080e329df9f41 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -63,5 +63,6 @@ class Kernel extends HttpKernel 'humanverification' => \App\Http\Middleware\HumanVerification::class, 'useragentmaster' => \App\Http\Middleware\UserAgentMaster::class, 'browserverification' => \App\Http\Middleware\BrowserVerification::class, + 'keyvalidation' => \App\Http\Middleware\KeyValidation::class, ]; } diff --git a/app/Http/Middleware/BrowserVerification.php b/app/Http/Middleware/BrowserVerification.php index f8ec4a32f4fd904c6d869a4605ce335ebcfe413e..0c1537db1edc33b30ae9e8a0af7c73e1ee8f5b21 100644 --- a/app/Http/Middleware/BrowserVerification.php +++ b/app/Http/Middleware/BrowserVerification.php @@ -18,7 +18,17 @@ class BrowserVerification */ public function handle($request, Closure $next) { - if ($request->filled("loadMore") && Cache::has($request->input("loadMore"))) { + + if(($request->input("out", "") === "api" || $request->input("out", "") === "atom10") && app('App\Models\Key')->getStatus()) { + header('Content-type: application/xml; charset=utf-8'); + } elseif(($request->input("out", "") === "api" || $request->input("out", "") === "atom10") && !app('App\Models\Key')->getStatus()) { + abort(403); + } else { + header('Content-type: text/html; charset=utf-8'); + } + header('X-Accel-Buffering: no'); + + if (($request->filled("loadMore") && Cache::has($request->input("loadMore"))) || app('App\Models\Key')->getStatus()) { return $next($request); } @@ -55,9 +65,6 @@ class BrowserVerification } } - header('Content-type: text/html; charset=utf-8'); - header('X-Accel-Buffering: no'); - $key = md5($request->ip() . microtime(true)); echo(view('layouts.resultpage.verificationHeader')->with('key', $key)->render()); diff --git a/app/Http/Middleware/HumanVerification.php b/app/Http/Middleware/HumanVerification.php index 805c86488a1e11b324ea55485f164d9eeb441e67..43997ee9ee90585bcce2a480bd8cfbefb35a077f 100644 --- a/app/Http/Middleware/HumanVerification.php +++ b/app/Http/Middleware/HumanVerification.php @@ -41,12 +41,12 @@ class HumanVerification unset($_SERVER["AGENT"]); /** - * If the user sends a Password or a key + * If the user sends a valid key or an appversion * We will not verificate the user. * If someone that uses a bot finds this out we * might have to change it at some point. */ - if ($request->filled('password') || $request->filled('key') || Cookie::get('key') !== null || $request->filled('appversion') || !env('BOT_PROTECTION', false)) { + if ($request->filled('appversion') || !env('BOT_PROTECTION', false) || app('App\Models\Key')->getStatus()) { $update = false; return $next($request); } diff --git a/app/MetaGer.php b/app/MetaGer.php index 11b2126bf549183e0e9f4ca87280248c8eb1fa36..2da7805ba743fb79059cbfaceb0a0a829746bb3e 100644 --- a/app/MetaGer.php +++ b/app/MetaGer.php @@ -78,6 +78,7 @@ class MetaGer protected $redisEngineResult; protected $redisCurrentResultList; public $starttime; + protected $dummy = false; public function __construct($hash = "") { @@ -206,33 +207,12 @@ class MetaGer ->with('browser', (new Agent())->browser()) ->with('fokus', $this->fokus); break; - case 'rich': - return view('resultpages.metager3rich') - ->with('results', $viewResults) - ->with('eingabe', $this->eingabe) - ->with('mobile', $this->mobile) - ->with('warnings', $this->warnings) - ->with('errors', $this->errors) - ->with('apiAuthorized', $this->apiAuthorized) - ->with('metager', $this) - ->with('browser', (new Agent())->browser()) - ->with('fokus', $this->fokus); - break; - case 'rss20': - return view('resultpages.metager3resultsrss20') - ->with('results', $viewResults) - ->with('eingabe', $this->eingabe) - ->with('apiAuthorized', $this->apiAuthorized) - ->with('metager', $this) - ->with('resultcount', sizeof($viewResults)) - ->with('fokus', $this->fokus); - break; + case 'api': - return response()->view('resultpages.metager3resultsatom10', ['results' => $viewResults, 'eingabe' => $this->eingabe, 'metager' => $this, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'apiAuthorized' => $this->apiAuthorized])->header('Content-Type', 'application/xml'); + return view('resultpages.metager3resultsatom10', ['eingabe' => $this->eingabe, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'metager' => $this]); break; case 'atom10': - return response()->view('resultpages.metager3resultsatom10', ['results' => $viewResults, 'eingabe' => $this->eingabe, 'metager' => $this, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'apiAuthorized' => true]) - ->header('Content-Type', 'application/xml'); + return view('resultpages.metager3resultsatom10', ['eingabe' => $this->eingabe, 'resultcount' => sizeof($viewResults), 'key' => $this->apiKey, 'metager' => $this]); break; case 'result-count': # Wir geben die Ergebniszahl und die benötigte Zeit zurück: @@ -321,7 +301,7 @@ class MetaGer if (empty($this->adgoalLoaded)) { $this->adgoalLoaded = false; } - if (!$this->apiAuthorized && !$this->adgoalLoaded) { + if (!$this->apiAuthorized && !$this->adgoalLoaded && !$this->dummy) { if (empty($this->adgoalHash)) { if (!empty($this->jskey)) { $js = Redis::connection('cache')->lpop("js" . $this->jskey); @@ -446,7 +426,7 @@ class MetaGer if ($publicKey === false) { return true; } - $tldList = ""; + $linkList = ""; foreach ($results as $result) { if (!$result->new) { continue; @@ -455,18 +435,34 @@ class MetaGer if (strpos($link, "http") !== 0) { $link = "http://" . $link; } - $tldList .= parse_url($link, PHP_URL_HOST) . ","; - $result->tld = parse_url($link, PHP_URL_HOST); + $linkList .= $link . ","; } - $tldList = rtrim($tldList, ","); + + $linkList = rtrim($linkList, ","); # Hashwert - $hash = md5("meta" . $publicKey . $tldList . "GER"); + $hash = md5($linkList . $privateKey); # Query $query = $this->q; - $link = "https://api.smartredirect.de/api_v2/CheckForAffiliateUniversalsearchMetager.php?p=" . urlencode($publicKey) . "&k=" . urlencode($hash) . "&tld=" . urlencode($tldList) . "&q=" . urlencode($query); + $link = "https://xf.gdprvalidate.de/v4/check"; + + # Which country to use + # Will be de for metager.de and en for metager.org + $country = "de"; + if (LaravelLocalization::getCurrentLocale() === "en") { + $country = "en"; + } + + $postfields = [ + "key" => $publicKey, + "panel" => "ZMkW9eSKJS", + "member" => "338b9Bnm", + "signature" => $hash, + "links" => $linkList, + "country" => $country, + ]; // Submit fetch job to worker $mission = [ @@ -475,9 +471,15 @@ class MetaGer "useragent" => "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0", "username" => null, "password" => null, - "headers" => null, + "headers" => [ + "Content-Type" => "application/x-www-form-urlencoded" + ], "cacheDuration" => 60, "name" => "Adgoal", + "curlopts" => [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => \http_build_query($postfields) + ] ]; $mission = json_encode($mission); Redis::rpush(\App\MetaGer::FETCHQUEUE_KEY, $mission); @@ -495,7 +497,7 @@ class MetaGer if ($hash === true) { return true; } - + if ($waitForResult) { while (microtime(true) - $startTime < 5) { $answer = Cache::get($hash); @@ -511,39 +513,24 @@ class MetaGer if ($answer === null) { return false; } + try { - $answer = json_decode($answer); - $publicKey = getenv('adgoal_public'); - $privateKey = getenv('adgoal_private'); - - # Nun müssen wir nur noch die Links für die Advertiser ändern: - foreach ($results as $result) { - $link = $result->link; - $result->tld = parse_url($link, PHP_URL_HOST); - } + $answer = json_decode($answer, true); - foreach ($answer as $el) { - $hoster = $el[0]; - $hash = $el[1]; + foreach ($answer as $partnershop) { + $targetUrl = $partnershop["url"]; foreach ($results as $result) { - if ($hoster === $result->tld && !$result->partnershop) { - # Hier ist ein Advertiser: - # Das Logo hinzufügen: + if ($result->link === $targetUrl && !$result->partnershop) { + # Ein Advertiser gefunden if ($result->image !== "") { - $result->logo = "https://img.smartredirect.de/logos_v2/60x30/" . urlencode($hash) . ".gif"; + $result->logo = $partnershop["logo"]; } else { - $result->image = "https://img.smartredirect.de/logos_v2/120x60/" . urlencode($hash) . ".gif"; + $result->image = $partnershop["logo"]; } # Den Link hinzufügen: - $targetUrl = $result->link; - # Query - $query = $this->q; - - $gateHash = md5($targetUrl . $privateKey); - $newLink = "https://api.smartredirect.de/api_v2/ClickGate.php?p=" . urlencode($publicKey) . "&k=" . urlencode($gateHash) . "&url=" . urlencode($targetUrl) . "&q=" . urlencode($query); - $result->link = $newLink; + $result->link = $partnershop["click_url"]; $result->partnershop = true; $result->changed = true; } @@ -577,30 +564,7 @@ class MetaGer public function authorize($key) { - $postdata = http_build_query(array( - 'dummy' => rand(), - )); - $opts = array( - 'http' => array( - 'method' => 'POST', - 'header' => 'Content-type: application/x-www-form-urlencoded', - 'content' => $postdata, - ), - ); - - $context = stream_context_create($opts); - - try { - $link = "https://key.metager3.de/" . urlencode($key) . "/request-permission/api-access"; - $result = json_decode(file_get_contents($link, false, $context)); - if ($result->{'api-access'} == true) { - return true; - } else { - return false; - } - } catch (\ErrorException $e) { - return false; - } + return app('App\Models\Key')->requestPermission(); } /* @@ -707,7 +671,7 @@ class MetaGer # Special case if search engines are disabled # Since bing is normally only active if a filter is set but it should be active, too if yahoo is disabled - if ($this->getFokus() === "web" && empty($this->enabledSearchengines["yahoo"]) && \Cookie::get("web_engine_bing") !== "off") { + if ($this->getFokus() === "web" && empty($this->enabledSearchengines["yahoo"]) && \Cookie::get("web_engine_bing") !== "off" && isset($this->sumaFile->sumas->{"bing"})) { $this->enabledSearchengines["bing"] = $this->sumaFile->sumas->{"bing"}; } @@ -794,6 +758,10 @@ class MetaGer foreach ($this->engines as $engine) { $keys[] = $engine->hash; } + # Noch searchengines enabled + if (empty($keys)) { + return; + } $cacheValues = Cache::many($keys); foreach ($this->engines as $engine) { if ($cacheValues[$engine->hash] !== null) { @@ -1055,7 +1023,7 @@ class MetaGer * Ende Suchmaschinenerstellung und Ergebniserhalt */ - public function parseFormData(Request $request) + public function parseFormData(Request $request, $auth = true) { # Sichert, dass der request in UTF-8 formatiert ist if ($request->input('encoding', 'utf8') !== "utf8") { @@ -1086,9 +1054,9 @@ class MetaGer $this->fokus = $request->input('focus', 'web'); # Suma-File if (App::isLocale("en")) { - $this->sumaFile = config_path() . "/sumasEn.json"; + $this->sumaFile = config_path() . ($this->dummy ? "/stress.json" : "/sumasEn.json"); } else { - $this->sumaFile = config_path() . "/sumas.json"; + $this->sumaFile = config_path() . ($this->dummy ? "/stress.json" : "/sumas.json"); } if (!file_exists($this->sumaFile)) { die(trans('metaGer.formdata.cantLoad')); @@ -1128,16 +1096,16 @@ class MetaGer $this->agent = new Agent(); $this->mobile = $this->agent->isMobile(); # Sprüche - if (!App::isLocale("de") || (\Cookie::has($this->getFokus() . '_setting_zitate') && \Cookie::get($this->getFokus() . '_setting_zitate') === "off")) { - $this->sprueche = "off"; + if (!App::isLocale('de') || (\Cookie::has('zitate') && \Cookie::get('zitate') === 'off')) { + $this->sprueche = 'off'; } else { - $this->sprueche = "on"; + $this->sprueche = 'on'; } - if ($request->filled("zitate") && $request->input('zitate') === "on" || $request->input('zitate') === "off") { + if ($request->filled('zitate') && $request->input('zitate') === 'on' || $request->input('zitate') === 'off') { $this->sprueche = $request->input('quotes'); } - $this->newtab = $request->input('newtab', 'on'); + $this->newtab = $request->input('new_tab', \Cookie::get('new_tab')); if ($this->newtab === "on") { $this->newtab = "_blank"; } elseif ($this->framed) { @@ -1191,7 +1159,7 @@ class MetaGer $this->apiKey = ""; } } - if ($this->apiKey) { + if ($this->apiKey && $auth) { $this->apiAuthorized = $this->authorize($this->apiKey); } @@ -1247,7 +1215,7 @@ class MetaGer $this->out = $request->input('out', "html"); # Standard output format html - if ($this->out !== "html" && $this->out !== "json" && $this->out !== "results" && $this->out !== "results-with-style" && $this->out !== "result-count" && $this->out !== "rss20" && $this->out !== "atom10" && $this->out !== "rich" && $this->out !== "api") { + if ($this->out !== "html" && $this->out !== "json" && $this->out !== "results" && $this->out !== "results-with-style" && $this->out !== "result-count" && $this->out !== "atom10" && $this->out !== "api") { $this->out = "html"; } # Wir schalten den Cache aus, wenn die Ergebniszahl überprüft werden soll @@ -1267,8 +1235,12 @@ class MetaGer public function createQuicktips() { # Die quicktips werden als job erstellt und zur Abarbeitung freigegeben - $quicktips = new \App\Models\Quicktips\Quicktips($this->q, LaravelLocalization::getCurrentLocale(), $this->getTime(), $this->sprueche); - return $quicktips; + if (!$this->dummy) { + $quicktips = new \App\Models\Quicktips\Quicktips($this->q, LaravelLocalization::getCurrentLocale(), $this->getTime(), $this->sprueche); + return $quicktips; + } else { + return null; + } } @@ -2068,4 +2040,9 @@ class MetaGer { $this->engines = $engines; } + + public function setDummy($dummy) + { + $this->dummy = $dummy; + } } diff --git a/app/Models/Key.php b/app/Models/Key.php new file mode 100644 index 0000000000000000000000000000000000000000..7748e1046cfc1de1fa3842435556a12c5bb2cf94 --- /dev/null +++ b/app/Models/Key.php @@ -0,0 +1,79 @@ +<?php + +namespace App\Models; + +class Key +{ + public $key; + public $status; # valid key = true, invalid key = false, unidentified key = null + private $keyserver = "https://key.metager.de/"; + + public function __construct($key, $status = null) + { + $this->key = $key; + $this->status = $status; + if (getenv("APP_ENV") !== "production") { + $this->keyserver = "https://dev.key.metager.de/"; + } + } + + # always returns true or false + public function getStatus() + { + if ($this->key !== '' && $this->status === null) { + $this->updateStatus(); + } + if ($this->status === null || $this->status === false) { + return false; + } else { + return true; + } + } + + + public function updateStatus() + { + try { + $link = $this->keyserver . urlencode($this->key) . "/request-permission/api-access"; + $result = json_decode(file_get_contents($link)); + if ($result->{'api-access'} == true) { + $this->status = true; + return true; + } else { + $this->status = false; + return false; + } + } catch (\ErrorException $e) { + return false; + } + } + + public function requestPermission() + { + $postdata = http_build_query(array( + 'dummy' => 0, + )); + $opts = array( + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type: application/x-www-form-urlencoded', + 'content' => $postdata, + ), + ); + + $context = stream_context_create($opts); + + try { + $link = $this->keyserver . urlencode($this->key) . "/request-permission/api-access"; + $result = json_decode(file_get_contents($link, false, $context)); + if ($result->{'api-access'} == true) { + return true; + } else { + $this->status = false; + return false; + } + } catch (\ErrorException $e) { + return false; + } + } +} diff --git a/app/Models/parserSkripte/Bing.php b/app/Models/parserSkripte/Bing.php index d8f096cc71ab8215459e3224b764fde2a3101380..ba894665af1f07b6fcb38ea2c4552e19b2dc3db6 100644 --- a/app/Models/parserSkripte/Bing.php +++ b/app/Models/parserSkripte/Bing.php @@ -4,6 +4,7 @@ namespace app\Models\parserSkripte; use App\Models\Searchengine; use Log; +use LaravelLocalization; class Bing extends Searchengine { @@ -12,6 +13,16 @@ class Bing extends Searchengine public function __construct($name, \stdClass $engine, \App\MetaGer $metager) { parent::__construct($name, $engine, $metager); + + if(LaravelLocalization::getCurrentLocale() === 'en'){ + $langFile = $metager->getLanguageFile(); + $langFile = json_decode(file_get_contents($langFile)); + $acceptLanguage = $metager->request->headers->all()['accept-language'][0]; + foreach($langFile->filter->{'parameter-filter'}->language->sumas->bing->values as $key => $value){ + if(stripos($acceptLanguage, "en") === 0 && stripos($acceptLanguage, $value) === 0) + $this->engine->{"get-parameter"}->mkt = $value; + } + } } public function loadResults($result) diff --git a/app/Models/parserSkripte/Dummy.php b/app/Models/parserSkripte/Dummy.php new file mode 100644 index 0000000000000000000000000000000000000000..8dc7af0b74865eb2457f936918d38e90ce98337a --- /dev/null +++ b/app/Models/parserSkripte/Dummy.php @@ -0,0 +1,85 @@ +<?php + +namespace app\Models\parserSkripte; + +use App\Models\Searchengine; +use Log; +use LaravelLocalization; + +class Dummy extends Searchengine +{ + public $results = []; + + public function __construct($name, \stdClass $engine, \App\MetaGer $metager) + { + parent::__construct($name, $engine, $metager); + } + + public function loadResults($result) + { + try { + $content = json_decode($result); + if (!$content) { + return; + } + + foreach ($content as $result) { + $title = $result->title; + $link = $result->link; + $anzeigeLink = $link; + $descr = $result->descr; + $this->counter++; + $this->results[] = new \App\Models\Result( + $this->engine, + $title, + $link, + $anzeigeLink, + $descr, + $this->engine->{"display-name"},$this->engine->homepage, + $this->counter + ); + } + } catch (\Exception $e) { + Log::error("A problem occurred parsing results from $this->name:"); + Log::error($e->getMessage()); + return; + } + } + public function getNext(\App\MetaGer $metager, $result) + { + try { + $results = json_decode($result); + + $newEngine = unserialize(serialize($this->engine)); + + $perPage = 0; + if(isset($newEngine->{"get-parameter"}->count)){ + $perPage = $newEngine->{"get-parameter"}->count; + } else { + $perPage = 10; + } + + $offset = 0; + if(empty($newEngine->{"get-parameter"}->skip)){ + $offset = $perPage; + } else { + $offset = $newEngine->{"get-parameter"}->skip + $perPage; + } + + if (PHP_INT_MAX - $perPage < ($offset + $perPage)) { + return; + } else { + $newEngine->{"get-parameter"}->skip = strval($offset); + } + + $next = new Dummy($this->name, $newEngine, $metager); + $this->next = $next; + + } catch (\Exception $e) { + Log::error("A problem occurred parsing results from $this->name:"); + Log::error($e->getMessage()); + return; + } + + } +} \ No newline at end of file diff --git a/app/Providers/KeyServiceProvider.php b/app/Providers/KeyServiceProvider.php new file mode 100644 index 0000000000000000000000000000000000000000..d4922504a9abbed244d17b0f0571d2de6b701ee5 --- /dev/null +++ b/app/Providers/KeyServiceProvider.php @@ -0,0 +1,40 @@ +<?php + +namespace App\Providers; + +use Illuminate\Support\ServiceProvider; +use Request; +use Cookie; +use App\Models\Key; + +class KeyServiceProvider extends ServiceProvider +{ + /** + * Register services. + * + * @return void + */ + public function register() + { + $key = ""; + if(Cookie::has('key')) { + $key = Cookie::get('key'); + } + if(Request::filled('key')) { + $key = Request::input('key'); + } + $this->app->singleton(Key::class, function ($app) use ($key) { + return new Key($key); + }); + } + + /** + * Bootstrap services. + * + * @return void + */ + public function boot() + { + // + } +} diff --git a/config/app.php b/config/app.php index 47828b33d594d301f7af0c023709b3032f90cd4f..67d46683195056c5ead15a83f219c69c5b5f740f 100644 --- a/config/app.php +++ b/config/app.php @@ -179,6 +179,7 @@ return [ App\Providers\RouteServiceProvider::class, Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider::class, App\Providers\MetaGerProvider::class, + App\Providers\KeyServiceProvider::class, Jenssegers\Agent\AgentServiceProvider::class, Fideloper\Proxy\TrustedProxyServiceProvider::class, Mews\Captcha\CaptchaServiceProvider::class, diff --git a/config/nginx-default-dev.conf b/config/nginx-default-dev.conf new file mode 100644 index 0000000000000000000000000000000000000000..0424e725ec0a6ef5844cad5dd64bd58e149d3bee --- /dev/null +++ b/config/nginx-default-dev.conf @@ -0,0 +1,55 @@ +server { + listen 80; + server_name localhost; + root /html/public; + index index.php index.html index.htm; + + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ \.php$ { + try_files $uri /index.php =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass phpfpm:9000; + fastcgi_index index.php; + fastcgi_read_timeout 900; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} \ No newline at end of file diff --git a/config/stress.json b/config/stress.json new file mode 100644 index 0000000000000000000000000000000000000000..181de977f56660ea1cd120b9eccc317df7d7c0f7 --- /dev/null +++ b/config/stress.json @@ -0,0 +1,115 @@ +{ + "sumas": { + "dummy": { + "host": "production-auto-deploy.dummy-engine-87.svc.cluster.local", + "path": "\/", + "port": 80, + "query-parameter": "q", + "input-encoding": "utf8", + "output-encoding": "utf8", + "parser-class": "Dummy", + "get-parameter": {}, + "request-header": {}, + "display-name": "dummy", + "engine-boost": 1, + "cache-duration": 0, + "disabled": false, + "filter-opt-in": false, + "homepage": "https:\/\/gitlab.metager.de\/open-source\/dummy-engine" + } + }, + "foki": { + "web": { + "display-name": "index.foki.web", + "sumas": [ + "dummy" + ], + "main": [ + "dummy" + ] + } + }, + "filter": { + "query-filter": {}, + "parameter-filter": { + "count": { + "name": "metaGer.filter.count", + "desc": "", + "get-parameter": "count", + "values": { + "10": "10", + "20": "20", + "30": "30", + "40": "40", + "50": "50", + "100": "100" + }, + "sumas": { + "dummy": { + "get-parameter": "count", + "values": { + "10": "10", + "20": "20", + "30": "30", + "40": "40", + "50": "50", + "100": "100" + } + } + } + }, + "min": { + "name": "metaGer.filter.min", + "desc": "", + "get-parameter": "min", + "values": { + "nofilter" : "0", + "2": "2", + "4": "4", + "6": "6", + "8": "8", + "10": "10" + }, + "sumas": { + "dummy": { + "get-parameter": "min", + "values": { + "nofilter" : "0", + "2": "2000", + "4": "4000", + "6": "6000", + "8": "8000", + "10": "10000" + } + } + } + }, + "max": { + "name": "metaGer.filter.max", + "desc": "", + "get-parameter": "max", + "values": { + "nofilter" : "0", + "2": "2", + "4": "4", + "6": "6", + "8": "8", + "10": "10" + }, + "sumas": { + "dummy": { + "get-parameter": "max", + "values": { + "nofilter" : "0", + "2": "2000", + "4": "4000", + "6": "6000", + "8": "8000", + "10": "10000" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/config/sumas.json.example b/config/sumas.json.example new file mode 100644 index 0000000000000000000000000000000000000000..d9962295300d34cd9e18f60f20a883b3c251d36c --- /dev/null +++ b/config/sumas.json.example @@ -0,0 +1,115 @@ +{ + "sumas": { + "dummy": { + "host": "dummy-nginx", + "path": "\/", + "port": 80, + "query-parameter": "q", + "input-encoding": "utf8", + "output-encoding": "utf8", + "parser-class": "Dummy", + "get-parameter": {}, + "request-header": {}, + "display-name": "dummy", + "engine-boost": 1, + "cache-duration": -1, + "disabled": false, + "filter-opt-in": false, + "homepage": "https:\/\/gitlab.metager.de\/open-source\/dummy-engine" + } + }, + "foki": { + "web": { + "display-name": "index.foki.web", + "sumas": [ + "dummy" + ], + "main": [ + "dummy" + ] + } + }, + "filter": { + "query-filter": {}, + "parameter-filter": { + "count": { + "name": "metaGer.filter.count", + "desc": "", + "get-parameter": "count", + "values": { + "10": "10", + "20": "20", + "30": "30", + "40": "40", + "50": "50", + "100": "100" + }, + "sumas": { + "dummy": { + "get-parameter": "count", + "values": { + "10": "10", + "20": "20", + "30": "30", + "40": "40", + "50": "50", + "100": "100" + } + } + } + }, + "min": { + "name": "metaGer.filter.min", + "desc": "", + "get-parameter": "min", + "values": { + "nofilter" : "0", + "2": "2", + "4": "4", + "6": "6", + "8": "8", + "10": "10" + }, + "sumas": { + "dummy": { + "get-parameter": "min", + "values": { + "nofilter" : "0", + "2": "2000", + "4": "4000", + "6": "6000", + "8": "8000", + "10": "10000" + } + } + } + }, + "max": { + "name": "metaGer.filter.max", + "desc": "", + "get-parameter": "max", + "values": { + "nofilter" : "0", + "2": "2", + "4": "4", + "6": "6", + "8": "8", + "10": "10" + }, + "sumas": { + "dummy": { + "get-parameter": "max", + "values": { + "nofilter" : "0", + "2": "2000", + "4": "4000", + "6": "6000", + "8": "8000", + "10": "10000" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/config/sumas.xml.example b/config/sumas.xml.example deleted file mode 100644 index c9de862dea063a45488e74ab7e220afcc89c7600..0000000000000000000000000000000000000000 --- a/config/sumas.xml.example +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<sumas> - <suma name="mnogosearch" host="mg3.suma-ev.de" skript="/cgi-bin/search.cgi" formData="q=<<QUERY>>&cs=utf-8&ps=20" package="mnogosearch" type="web" port="80" userSelectable="1" displayName="Wikis" outputEncoding="Latin1"/> - <suma name="BASE" host="baseapi.ub.uni-bielefeld.de" skript="/cgi-bin/BaseHttpSearchInterface.fcgi" formData="func=PerformSearch&query=<<QUERY>>" package="BASE" port="80" formDataEn="func=PerformSearch&query=<<QUERY>>" displayName="BASE" userSelectable="1" type="wissenschaft" homepage="http://www.base-search.net/"/> - <suma name="blogsearch" host="blogsuche.suma-ev.de" skript="/blogsearch/xmlout.php" formData="search=<<QUERY>>&length=400&rows=50&category=<<CATEGORY>>" package="blogsearch" port="80" inputEncoding="utf8" displayName="Blogsuche" userSelectable="1" type="andere" engineBoost="0.2" homepage="http://blogsuche.suma-ev.de/blogsearch/index.php"/> -</sumas> diff --git a/docker-compose.yml b/docker-compose.yml index 86f67380c09364af43322a4efa01b536faf09119..1b05b4f8884f4735a4cd1110436c4b5504b4dac3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,7 +56,7 @@ services: volumes: - .:/html - ./config/nginx.conf:/etc/nginx/nginx.conf - - ./config/nginx-default.conf:/etc/nginx/conf.d/default.conf + - ./config/nginx-default-dev.conf:/etc/nginx/conf.d/default.conf ports: - "8080:80" worker: @@ -76,3 +76,14 @@ services: volumes: - .:/html command: "php artisan dusk" + dummy-phpfpm: + restart: on-failure + image: registry.metager.de/open-source/dummy-engine/master + working_dir: /html + dummy-nginx: + depends_on: + - "dummy-phpfpm" + restart: on-failure + image: registry.metager.de/open-source/dummy-engine/master + working_dir: /html + command: sh -c "sed -i 's/fastcgi_pass localhost:9000;/fastcgi_pass dummy-phpfpm:9000;/g' /etc/nginx/conf.d/default.conf && nginx" \ No newline at end of file diff --git a/init.sh b/init.sh index 42af2efa729c488cf1e2ab9d83222a6d67111426..63305b0bdc1795424cbf2d708620b31977d1e2a0 100755 --- a/init.sh +++ b/init.sh @@ -7,6 +7,14 @@ if [ ! -f "/data/.env" ]; then cp /data/.env.example /data/.env fi +if [ ! -f "/data/config/sumas.json" ]; then + cp /data/config/sumas.json.example /data/config/sumas.json +fi + +if [ ! -f "/data/config/sumasEn.json" ]; then + cp /data/config/sumas.json.example /data/config/sumasEn.json +fi + if [ -f "/data/database/useragents.sqlite" ]; then rm /data/database/useragents.sqlite fi diff --git a/resources/js/scriptResultPage.js b/resources/js/scriptResultPage.js index 9caa935fae20f47e858cb0f8ea3272503a5cb7f2..18ce51a129fc0f6d50f281608680f144d8f93de7 100644 --- a/resources/js/scriptResultPage.js +++ b/resources/js/scriptResultPage.js @@ -5,11 +5,11 @@ $(document).ready(function () { }); function botProtection() { - $('.result').find('a').click(function () { + $('.result').find('a').click(function (e) { var link = $(this).attr('href'); var newtab = false; var top = false; - if ($(this).attr('target') == '_blank') { + if ($(this).attr('target') == '_blank' || e.ctrlKey) { newtab = true; } else if ($(this).attr('target') == "_top") { top = true; @@ -32,10 +32,7 @@ function botProtection() { } } }); - if (!newtab) - return false; - else - return true; + return newtab; }); } @@ -135,4 +132,4 @@ function loadMoreResults() { }); } }, 1000); -} \ No newline at end of file +} diff --git a/resources/lang/de/key.php b/resources/lang/de/key.php index c39f62f45b1f0f99f0586fc3277f26ee4334da06..f29f434b0c955872eb77b9fe56ae78593892bc20 100644 --- a/resources/lang/de/key.php +++ b/resources/lang/de/key.php @@ -7,8 +7,8 @@ return [ 'p3' => 'Wenn Sie sich den Cookie anschauen steht dort drin "key=xxxx". Wir verwenden diesen dementsprechend nicht für Tracking-Zwecke. Er wird auch zu keinem Zeitpunkt in irgendeiner Form von uns gespeichert oder geloggt.', 'p4' => 'Wichtig: Um diese Funktion nutzen zu können, müssen Sie Cookies in Ihrem Browser zugelassen haben. Die Einstellung bleibt dann solange gespeichert, wie Ihr Browser Cookies speichert.', 'p5' => 'Um den Schlüssel darüber hinausgehend speichern zu können haben Sie folgende Möglichkeiten:', - 'li1' => 'Richten Sie sich <code>:url</code>', - 'li2' => 'Falls Sie MetaGer als Standardsuchmaschine verwenden, können Sie nach der Schlüsseleingabe den Eintrag löschen und erneut hinzufügen. Wenn Sie in Ihrem Browser einen "Suchstring" eingeben müssen, können Sie <code>:url</code> verwenden.', + 'li1' => 'Richten Sie sich folgenden Link als Startseite/Lesezeichen ein:', + 'li2' => 'Falls Sie MetaGer als Standardsuchmaschine verwenden, können Sie nach der Schlüsseleingabe den Eintrag löschen und erneut hinzufügen. Wenn Sie in Ihrem Browser einen "Suchstring" eingeben müssen, können Sie folgenden verwenden:', 'placeholder1' => 'Schlüssel eingeben...', 'removeKey' => 'aktuellen Schlüssel entfernen', 'invalidKey' => 'Der eingegebene Schlüssel ist ungültig', diff --git a/resources/lang/de/metaGer.php b/resources/lang/de/metaGer.php index 549fb420085adf703ddbed7a66adc4c1f25f43a6..220c08c0755427224e29241decb8321098258818 100644 --- a/resources/lang/de/metaGer.php +++ b/resources/lang/de/metaGer.php @@ -133,5 +133,10 @@ return [ "filter.rabate" => "Min. Rabatt", + "filter.count" => "Anzahl", + "filter.skip" => "Ãœberspringen", + "filter.min" => "Minimum Sleep (in s)", + "filter.max" => "Maximum Sleep (in s)", + "settings" => "Einstellungen", ]; diff --git a/resources/lang/de/plugin-desktop/desktop-edge.php b/resources/lang/de/plugin-desktop/desktop-edge.php index 6eea328db40271b756722bf4df6a34c33217dda2..19334ba642ae0a6db23ddf6b97da39a0653c7ae4 100644 --- a/resources/lang/de/plugin-desktop/desktop-edge.php +++ b/resources/lang/de/plugin-desktop/desktop-edge.php @@ -14,7 +14,7 @@ 'default-search-v18.4' => 'Wählen Sie "MetaGer: Sicher suchen & finden..." und klicken Sie auf "Als Standard".', //Instructions for Edge version >= 80 - 'default-search-v80.1' => 'Geben Sie "edge://settings/searchEngines" in der Adressleiste ein, um in die Suchmaschineneinstellungen zu gelangen.', + 'default-search-v80.1' => 'Öffnen Sie einen neuen Tab und geben Sie "edge://settings/searchEngines" in der Adressleiste ein, um in die Suchmaschineneinstellungen zu gelangen.', 'default-search-v80.2' => 'Klicken Sie neben dem Eintrag von MetaGer auf "<i class="fa fa-ellipsis-h"></i>" und wählen Sie "Als Standard".', 'default-page-v15.1' => 'Klicken Sie oben rechts im Browser auf "<i class="fa fa-ellipsis-h"></i>" und öffnen Sie die "Einstellungen".', diff --git a/resources/lang/de/plugin-mobile/mobile-firefox.php b/resources/lang/de/plugin-mobile/mobile-firefox.php index 0c215b31060a11f33fec129c547afbe668ed278c..eda9f8e1bcf70aca936ea90af5cac328e66ec53c 100644 --- a/resources/lang/de/plugin-mobile/mobile-firefox.php +++ b/resources/lang/de/plugin-mobile/mobile-firefox.php @@ -13,5 +13,7 @@ 'default-search-v80.2' => 'Wählen Sie den Menüpunkt "Einstellungen".', 'default-search-v80.3' => 'In dem dann erscheinenden Menü wählen Sie in der Kategorie "Allgemein" den Menüpunkt "Suchen".', 'default-search-v80.4' => 'Tippen Sie auf "+ Suchmaschine hinzufügen".', - 'default-search-v80.5' => 'Wählen Sie "Andere" aus und tragen darunter den Namen (MetaGer) und den Such-String ein. Bestätigen Sie mit "<i class="fas fa-check"></i>" in der rechten oberen Ecke.', + 'default-search-v80.5' => 'Wählen Sie "Andere" aus und tragen darunter den Namen (MetaGer) und den Such-String ein.', + 'default-search-v80.6' => 'Bestätigen Sie mit "<i class="fas fa-check"></i>" in der rechten oberen Ecke.', + 'default-search-v80.7' => 'Tippen Sie in der dann erscheinenden Liste auf MetaGer.', ]; diff --git a/resources/lang/de/plugin-page.php b/resources/lang/de/plugin-page.php index 235f4dfc51354d7fcac95ba831838e5cf897a285..797c4e29214daa3f46d877ce2372d3875fd2f2d1 100644 --- a/resources/lang/de/plugin-page.php +++ b/resources/lang/de/plugin-page.php @@ -15,6 +15,9 @@ return [ 'head.9' => 'MetaGer zu UCBrowser hinzufügen', 'head.10' => 'Metager zu Samsung Internet hinzufügen', + 'search-engine.1' => 'Was macht eine Standardsuchmaschine?', + 'search-engine.2' => 'Mit MetaGer als Standardsuchmaschine können Sie Ihren Browser anweisen Suchen, welche z.B. über die Adressleiste durchgeführt werden, automatisch von MetaGer beantworten zu lassen.', + 'browser-download' => 'Firefox herunterladen', 'firefox-plugin' => 'MetaGer als Standardsuchmaschine mit Add-on einrichten', 'firefox-default-search' => 'MetaGer als Standardsuchmaschine ohne Add-on einrichten', diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php index a1b23f6e1102e655883d72213b155ccad658f4b9..3925e423a48bbcd475e9dbed2b284c7481e2d183 100644 --- a/resources/lang/de/settings.php +++ b/resources/lang/de/settings.php @@ -25,13 +25,17 @@ return [ 'add' => 'Hinzufügen', 'clear' => 'Blacklist leeren', 'copy' => 'Kopieren', + 'hint' => 'Diese Einstellungen betreffen alle Fokusse und Unterseiten übergreifend!', 'darkmode' => 'Dunklen Modus umschalten', - 'darkmode-hint' => 'Die Einstellung für den dunklen Modus betrifft alle Fokusse und Unterseiten übergreifend!', 'system' => 'Systemstandard', 'dark' => 'Dunkel', 'light' => 'Hell', + 'newTab' => 'Ergebnisse in neuem Tab öffnen', + 'off' => 'Aus', + 'on' => 'An', + // Translations from the settings overview 'noSettings' => 'Aktuell sind keine Einstellungen gesetzt!', 'allSettings.header' => 'Auf :root gesetzte Einstellungen', @@ -45,5 +49,4 @@ return [ 'key' => 'Ihr Schlüssel für die werbefreie Suche', 'blentry' => 'Blacklisteintrag', 'removeCookie' => 'Diesen Cookie entfernen', - 'dm' => 'Dunkler Modus', ]; diff --git a/resources/lang/de/team.php b/resources/lang/de/team.php index 21bb3b5ec4f2e3661199bc7c64b1b5b6058cda29..163286560aadac0c8c1c9f79606c17b8da46ad3a 100644 --- a/resources/lang/de/team.php +++ b/resources/lang/de/team.php @@ -1,16 +1,16 @@ <?php return [ - 'role.0' => 'geschäftsführender Vorstand', - 'role.1' => 'Vorstand', - 'role.2' => 'Jugendschutzbeauftragte', - 'role.3' => 'Pressereferentin', - 'role.4' => 'Programmierer', - 'role.5' => 'Programmierer', - 'role.6' => 'Programmiererin', - 'role.7' => 'Sekretariat', - 'role.8' => 'Founder', - 'role.9' => 'Praktikant', + 'role.0' => 'geschäftsführender Vorstand', + 'role.1' => 'Vorstand', + 'role.1.1' => 'Vorständin', + 'role.2' => 'Jugendschutzbeauftragte', + 'role.3' => 'Pressereferentin', + 'role.5' => 'Programmierer', + 'role.6' => 'Programmiererin', + 'role.7' => 'Sekretariat', + 'role.8' => 'Founder', + 'role.9' => 'Praktikant', 'contact.1' => 'Fragen/Probleme zu MetaGer etc. bitte immer an <a href="mailto:office@suma-ev.de">office@suma-ev.de</a> mailen, oder das <a href="/kontakt/">Kontaktformular mit Verschlüsselung</a> benutzten.', 'contact.2' => 'Sollten Sie jemals eine E-Mail mit seltsamem Inhalt bekommen, auf der unsere Namen und/oder unsere E-Mail Adressen als Absender genannt sind, lesen Sie bitte hier weiter: <a href="https://metager.de/wsb/fakemail/">https://metager.de/wsb/fakemail/</a>', diff --git a/resources/lang/en/key.php b/resources/lang/en/key.php index 8026105ee2fefc9038bf01268a3d499dde2030d0..a78cb1fe3b7d01ec60431d39d5972a814409158d 100644 --- a/resources/lang/en/key.php +++ b/resources/lang/en/key.php @@ -7,7 +7,7 @@ return [ 'p3' => 'If you look at the cookie there is "key = xxxx" in there. We do not use it for tracking purposes. It is also never stored or logged by us in any way.', 'p4' => 'Important: In order to use this function, you must have allowed cookies in your browser. The setting will remain saved as long as your browser saves cookies.', 'p5' => 'In order to be able to save the key beyond that, you have the following options:', - 'li1' => 'Set up <code>:url</code> as the start page in your browser.', + 'li1' => 'Set the following URL as start page/bookmark in your browser:', 'li2' => 'If you are using MetaGer as the default search engine, you can delete the entry after entering the key and add it again. If you have to enter a "search string" in your browser, you can use <code>:url</code>.', 'placeholder1' => 'Enter key ...', 'removeKey' => 'Remove current key', diff --git a/resources/lang/en/metaGer.php b/resources/lang/en/metaGer.php index 2af697cc3d9539792a3bef180ec1224a309084c8..66f0557cbba5b8f561f2c9a68a7f51206f04e2da 100644 --- a/resources/lang/en/metaGer.php +++ b/resources/lang/en/metaGer.php @@ -133,5 +133,10 @@ return [ "filter.rabate" => "Min. Rabate", + "filter.count" => "Count", + "filter.skip" => "Skip", + "filter.min" => "Minimum sleep (in s)", + "filter.max" => "Maximum sleep (in s)", + "settings" => "Settings", ]; diff --git a/resources/lang/en/plugin-mobile/mobile-firefox.php b/resources/lang/en/plugin-mobile/mobile-firefox.php index eaa46c66284850ddeff273667f8c24f0e87956a8..19eba99427524ee8dde064477140df5dffbfdda4 100644 --- a/resources/lang/en/plugin-mobile/mobile-firefox.php +++ b/resources/lang/en/plugin-mobile/mobile-firefox.php @@ -13,5 +13,7 @@ 'default-search-v80.2' => 'Choose Settings.', 'default-search-v80.3' => 'Under "General" pick "Search".', 'default-search-v80.4' => 'Tap "+ Add search engine".', - 'default-search-v80.5' => 'Choose "Other", enter "MetaGer" as name and the search string to use. Finally tap "<i class="fas fa-check"></i>" in the top right corner to save.', + 'default-search-v80.5' => 'Choose "Other", enter "MetaGer" as name and the search string to use.', + 'default-search-v80.6' => 'Tap "<i class="fas fa-check"></i>" in the top right corner to save.', + 'default-search-v80.7' => 'Finally choose the MetaGer entry from the list.', ]; diff --git a/resources/lang/en/plugin-page.php b/resources/lang/en/plugin-page.php index c70c0a794829a62b277018922508a6cb7be062c1..557aaefc6bdb6e08e9be68d0944cb01e9a84b361 100644 --- a/resources/lang/en/plugin-page.php +++ b/resources/lang/en/plugin-page.php @@ -15,6 +15,9 @@ return [ 'head.9' => 'Add MetaGer to your UCBrowser', 'head.10' => 'Add MetaGer to your Samsung Internet', + 'search-engine.1' => 'What is a default search engine?', + 'search-engine.2' => 'With MetaGer as default searchengine you can instruct your browser to automatically use MetaGer when search queries are entered i.e. into the adress bar.', + 'browser-download' => 'Download Firefox', 'firefox-plugin' => 'Set MetaGer as default search engine with add-on', 'firefox-default-search' => 'Set MetaGer as default search engine without add-on', diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php index 5bc3590ead6028d23dc7b25dc10958b545244fd5..d45aec158ba791736576d44560aca2baf292453c 100644 --- a/resources/lang/en/settings.php +++ b/resources/lang/en/settings.php @@ -25,13 +25,17 @@ return [ 'add' => 'Add', 'clear' => 'Clear black list', 'copy' => 'Copy', + 'hint' => 'These settings affect all foci and sub-pages!', 'darkmode' => 'Toggle dark mode', - 'darkmode-hint' => 'The setting for dark mode affects all foci and sub-pages!', 'system' => 'System Default', 'dark' => 'Dark', 'light' => 'Light', + 'newTab' => 'Open results in new tabs', + 'off' => 'off', + 'on' => 'on', + // Translations from the settings overview 'noSettings' => "Currently no settings are set!", 'allSettings.header' => "Settings on :root", @@ -45,5 +49,4 @@ return [ 'key' => "Your key to the ad-free search", 'blentry' => 'Black list entry', 'removeCookie' => "Remove this cookie", - 'dm' => 'Dark mode', ]; diff --git a/resources/lang/en/team.php b/resources/lang/en/team.php index 6ca00fb4aa4382313360b59697abbc6ff0d00dfd..af2d52a7b75c5cb0588b3dac5e8139817a6d5f94 100644 --- a/resources/lang/en/team.php +++ b/resources/lang/en/team.php @@ -1,16 +1,16 @@ <?php return [ - "role.0" => "CEO", - "role.1" => "executive", - "role.2" => "youth protection commissioner", - "role.3" => "press secretary", - "role.4" => "programmer", - "role.5" => "programmer", - "role.6" => "programmer", - "role.7" => "secretary", - "role.8" => "founder", - "role.9" => "trainee", + "role.0" => "CEO", + "role.1" => "executive", + "role.1.1" => "executive", + "role.2" => "Youth protection commissioner", + "role.3" => "press secretary", + "role.5" => "programmer", + "role.6" => "programmer", + "role.7" => "secretary", + "role.8" => "founder", + "role.9" => "trainee", "contact.1" => "Please mail your questions/problems about MetaGer etc. to <a href=\"mailto:office@suma-ev.de\">office@suma-ev.de</a> or use the <a href=\"/en/kontakt/\">contact form with encryption</a>.", "contact.2" => "If you get any emails with strange contents from us please read more about this: <a href=\"https://metager.de/wsb/fakemail/\">https://metager.de/wsb/fakemail/</a>", diff --git a/resources/lang/es/plugin-desktop/desktop-ie.php b/resources/lang/es/plugin-desktop/desktop-ie.php new file mode 100644 index 0000000000000000000000000000000000000000..2491de5b0d7fd854e1e1418447b3b7571ae29f46 --- /dev/null +++ b/resources/lang/es/plugin-desktop/desktop-ie.php @@ -0,0 +1,14 @@ +<?php + +return [ + "default-search-v9.1" => "Haga clic en <a href=\"javascript:window.external.addSearchProvider($('link[rel=search]').attr('href'));\">aquÃ</a>, para agregar MetaGer como motor de búsqueda.", + "default-search-v9.2" => "Seleccione \"Establecer este buscador como predeterminado\" y haga clic en \"Agregar\".", + "default-search-v11.1" => "Haga clic en <a href=\"javascript:window.external.addSearchProvider($('link[rel=search]').attr('href'));\">aquÃ</a>, para agregar MetaGer como motor de búsqueda.", + "default-search-v11.2" => "En la parte superior derecha de su navegador haga clic en \"<i class=\"fa fa-cog\" aria-hidden=\"true\"></i>\".", + "default-search-v11.3" => "Seleccione el elemento del menú \"Administrar complementos\".", + "default-search-v11.4" => "En la sección \"Tipos de complementos\", haga clic en \"Proveedores de búsqueda\", luego en el panel derecho pulse MetaGer.", + "default-search-v11.5" => "Confirmar pulsando en el botón \"Como predeterminado\" que tiene abajo.", + "default-page-v9.1" => "Haga clic en <a href=\"/\" target=\"_blank\" rel=\"noopener\">aquà </a> para abrir MetaGer en una nueva pestaña.", + "default-page-v9.2" => "En la nueva pestaña arriba a la izquierda, haga clic en la flecha junto a la <i class=\"fas fa-home\" aria-hidden=\"true\"> </i> y luego en \"Cambiar o agregar página de inicio\".", + "default-page-v9.3" => "En la ventana emergente que aparece, seleccione \"Usar esta página como única página principal\" y luego haga clic en \"SÃ\"." +]; diff --git a/resources/lang/es/plugin-desktop/desktop-opera.php b/resources/lang/es/plugin-desktop/desktop-opera.php new file mode 100644 index 0000000000000000000000000000000000000000..677fe71500ddfafdfc3fd7a989482f27a9c42103 --- /dev/null +++ b/resources/lang/es/plugin-desktop/desktop-opera.php @@ -0,0 +1,11 @@ +<?php + +return [ + "default-search-v36.1" => "Haga un clic derecho del ratón en el campo de entrada de búsqueda al final de estas instrucciones.", + "default-search-v36.2" => "Seleccione la opción \"Crear motor de búsqueda ...\" en el menú contextual.", + "default-search-v36.3" => "En la ventana emergente, haga clic en \"Crear\".", + "default-page-v36.1" => "En la parte superior izquierda del navegador haga clic en el sÃmbolo de Opera o \"Menú\" y pulse en la opción \"Configuración\".", + "default-page-v36.2" => "En la sección \"En inicio\", seleccione la opción \"Abrir una página especifica o conjunto de páginas\" y luego haga clic en \"Agregar nueva página\" o \"Establecer página\".", + "default-page-v36.3" => "Escriba \":link\" como URL de la página web en \"Agregar nueva página\".", + "default-page-v36.4" => "NOTA: \r\nTodos los sitios web que aparecen ahora en la lista se abrirán cuando se inicie el navegador. Puede borrar las entradas de la lista haciendo clic en \"<i class =\" fas fa-ellipsis-h \"></i>\" junto a la entrada que desea eliminar." +]; diff --git a/resources/lang/es/plugin-desktop/desktop-vivaldi.php b/resources/lang/es/plugin-desktop/desktop-vivaldi.php new file mode 100644 index 0000000000000000000000000000000000000000..94ce622de994a974bbc963fe23ff4d4f75eed857 --- /dev/null +++ b/resources/lang/es/plugin-desktop/desktop-vivaldi.php @@ -0,0 +1,9 @@ +<?php + +return [ + "default-search-v3-3.1" => "Haga un clic derecho del ratón en el campo de entrada de búsqueda que tiene debajo de la instrucción.", + "default-search-v3-3.2" => "En el menú contextual seleccione la opción \"Crear búsqueda...\"", + "default-search-v3-3.3" => "En la ventana emergente, haga clic en \"Establecer como búsqueda predeterminada\" y a continuación en \"Agregar\".", + "default-page-v3-3.1" => "En la esquina superior izquierda haga clic en el sÃmbolo de Vivaldi y en \"Extras\" seleccione el elemento del menú \"<i class=\" fa fa-cog\" aria-hidden=\" true \"></i> Configuración\"", + "default-page-v3-3.2" => "En la ventana que aparece debajo de \"Página de inicio\", seleccione \"Personalizado:\" e ingrese :link." +]; diff --git a/resources/lang/es/team.php b/resources/lang/es/team.php index 1ddeb07834c0f7878195f10733261c65982c82d8..44f5d382e2096ee19300b230a90028584727b2dd 100644 --- a/resources/lang/es/team.php +++ b/resources/lang/es/team.php @@ -1,15 +1,15 @@ <?php return [ - "role.0" => "Director ejecutivo [CEO]", - "role.1" => "la junta directiva", - "role.2" => "Moderar y protección de menores", - "role.3" => "Revistar la prensa", - "role.4" => " Programador | programadora", - "role.5" => " Programador | programadora", - "role.6" => " Programador | programadora", - "role.7" => "La oficina", - "role.8" => "fundador", + "role.0" => "Director ejecutivo [CEO]", + "role.1" => "la junta directiva", + "role.1.1" => "la junta directiva", + "role.2" => "Moderar y protección de menores", + "role.3" => "Revistar la prensa", + "role.5" => " Programador | programadora", + "role.6" => " Programador | programadora", + "role.7" => "La oficina", + "role.8" => "fundador", "contact.1" => "Preguntas, propuestas....escribir un e-mail a <a href=\"mailto:office@suma-ev.de\">office@suma-ev.de</a> o usan <a href=\"/kontakt/\">formulario contacto cifrado</a>.", "contact.3" => "Solo en caso de emergencia: escribir un e-mail a una persona determinada.", ]; diff --git a/resources/lang/es/widget.php b/resources/lang/es/widget.php index dfa5f706dbe06f450db927e23504843cf50e03f3..59e80441949fd7c7b11f0909f873d8d32091b72f 100644 --- a/resources/lang/es/widget.php +++ b/resources/lang/es/widget.php @@ -1,8 +1,9 @@ <?php return [ - "head" => "MetaGer Widget", - "body.1" => "MetaGer: un motor de búsqueda for suyo sitio web. Selecciona por favor:", + "head" => "Widget de MetaGer", + "body.1" => "MetaGer para la integración en su sitio web. Para hacer esto, seleccione dónde buscar:", "body.2" => "Búsqueda en el web", - "body.3" => "Búsqueda en el dominio solo (sitesearch)" -]; \ No newline at end of file + "body.3" => "Búsqueda en un solo dominio (sitesearch)", + "body.4" => "Nota: \r\nNo debe usar el widget si está tratando de dar la impresión en su sitio web de que MetaGer es su propio servicio o si se da la impresión de que sus páginas son las páginas reales de MetaGer (todo esto ya ha sucedido). Por este motivo, en particular, no está permitido eliminar nuestro logotipo." +]; diff --git a/resources/less/metager/general/specific.less b/resources/less/metager/general/specific.less index 028c845406144e4477c8459e2c156c52b69a9e5e..2f812a934e7876c25a8f008fd44cb353fbe9af6f 100644 --- a/resources/less/metager/general/specific.less +++ b/resources/less/metager/general/specific.less @@ -20,4 +20,14 @@ fieldset input[type=text] { padding-right: 10px; border-width: 1px; overflow: visible; +} + +.copyLink{ + display:flex; + .loadSettings{ + flex-grow:1; + width:100%; + background-color:@input-bg; + color:@input-text; + } } \ No newline at end of file diff --git a/resources/less/metager/pages/resultpage/result.less b/resources/less/metager/pages/resultpage/result.less index 7d5d91c64cdc33065b53f02c98e18d9f432441b9..7f4ded151b8f76363922769afa9405134dddff54 100644 --- a/resources/less/metager/pages/resultpage/result.less +++ b/resources/less/metager/pages/resultpage/result.less @@ -189,11 +189,7 @@ text-decoration: none; } } - @media (max-width: @screen-mobile) { - .result-open-newtab { - display: none; - } - } + .result-open-proxy { &, &:active, @@ -299,4 +295,4 @@ filter: invert(1) brightness(0.4); height:16px; margin-right: 4px; -} \ No newline at end of file +} diff --git a/resources/less/metager/pages/settings.less b/resources/less/metager/pages/settings.less index 767d8304624b554810a3282075a05c94ef95c9b3..57987b15f319cf01812c86e86ea756378dfff313 100644 --- a/resources/less/metager/pages/settings.less +++ b/resources/less/metager/pages/settings.less @@ -88,14 +88,4 @@ width:20px; } } - #cookieLink{ - display:flex; - align-items:left; - #loadSettings{ - flex-grow:1; - width:100%; - background-color:@input-bg; - color:@input-text; - } - } } \ No newline at end of file diff --git a/resources/less/metager/startpage-only.less b/resources/less/metager/startpage-only.less index 0a8cf49abf27bc73e648ec74996977f2ddc03bb4..d7019bc90d66e5809ef279201a11d51bb1fc6c1c 100644 --- a/resources/less/metager/startpage-only.less +++ b/resources/less/metager/startpage-only.less @@ -75,6 +75,9 @@ html { top: 0; z-index: 10; + @media(max-height: 150px){ + display:none; + } &>:nth-child(1) { background-color: @story-privacy-background; @@ -155,9 +158,11 @@ footer { align-items:center; min-height: 70vh; &:not(:nth-child(1)){ - padding-bottom: @clippathHeight; - padding-top: @clippathHeight; - margin-top: -@clippathHeight; + @supports(clip-path: polygon(0 0, 30% 0, 50% 30px, 70% 0, 100% 0, 100% 100%, 0 100%)) or (-webkit-clip-path: polygon(0 0, 40% 0, 50% 30px, 60% 0, 100% 0, 100% 100%, 0 100%)){ + padding-bottom: @clippathHeight; + padding-top: @clippathHeight; + margin-top: -@clippathHeight; + } } } diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index 5d5f9623226cec7cc79443010ef7adb9797d6d97..6748c428f754d00c99f889b252976c0020c06425 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -32,57 +32,52 @@ <div id="story-container"> <section id="story-privacy"> <h1>{{ trans('mg-story.privacy.title') }}</h1> - <ul class="story-links"> - <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "about") }}">{{ trans('mg-story.btn-about-us') }}</a></li> - <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "datenschutz") }}">{{ trans('mg-story.btn-data-protection') }}</a></li> - </ul> <figure class="story-icon"> <img src="/img/lock.svg" alt="{{ trans('mg-story.privacy.image.alt') }}"> </figure> <p>{!! trans('mg-story.privacy.p') !!}</p> + <ul class="story-links"> + <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "about") }}">{{ trans('mg-story.btn-about-us') }}</a></li> + <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "datenschutz") }}">{{ trans('mg-story.btn-data-protection') }}</a></li> + </ul> </section> <section id="story-ngo"> <h1>{{ trans('mg-story.ngo.title') }}</h1> - <ul class="story-links"> <li><a class="story-button" href="https://suma-ev.de/" target="_blank">{{ trans('mg-story.btn-SUMA-EV') }}</a></li> <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "spende") }}">{{ trans('mg-story.btn-donate') }}</a></li> <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/beitritt/") }}" target="_blank">{{ trans('mg-story.btn-member') }}</a></li> <li><a class="story-button" href="https://suma-ev.de/mitglieder/" target="_blank"> {{ trans('mg-story.btn-member-advantage') }}</a></li> </ul> <figure class="story-icon"> - <img src="/img/heart.svg" alt="{{ trans('mg-story.ngo.image.alt') }}"> + <img src="/img/heart.svg" alt="{{ trans('mg-story.ngo.image.alt') }}"> </figure> <p>{!!trans('mg-story.ngo.p') !!}</p> </section> <section id="story-diversity"> <h1>{{ trans('mg-story.diversity.title') }}</h1> + <figure class="story-icon"> + <img src="/img/rainbow.svg" alt="{{ trans('mg-story.diversity.image.alt') }}"> + </figure> + <p>{!! trans('mg-story.diversity.p') !!}</p> <ul class="story-links"> <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "about") }}">{{ trans('mg-story.btn-about-us') }}</a></li> <li><a class="story-button" href="https://gitlab.metager.de/open-source/MetaGer" target="_blank"><nobr>{{ trans('mg-story.btn-mg-code') }}</nobr></a></li> <!--<li><a class="story-button" href="https://metager.de/about">{{ trans('mg-story.btn-mg-algorithm') }}</a></li>--> </ul> - <figure class="story-icon"> - <img src="/img/rainbow.svg" alt="{{ trans('mg-story.diversity.image.alt') }}"> - </figure> - <p>{!! trans('mg-story.diversity.p') !!}</p> </section> <section id="story-eco"> <h1>{{ trans('mg-story.eco.title') }}</h1> - <ul class="story-links"> - <li><a class="story-button" href="https://www.hetzner.de/unternehmen/umweltschutz/" target="_blank">{{ trans('mg-story.btn-more') }}</a></li> - </ul> <figure class="story-icon"> <img src="/img/leaf.svg" alt="{{ trans('mg-story.eco.image.alt') }}"> </figure> <p>{!! trans('mg-story.eco.p')!!}</p> + <ul class="story-links"> + <li><a class="story-button" href="https://www.hetzner.de/unternehmen/umweltschutz/" target="_blank">{{ trans('mg-story.btn-more') }}</a></li> + </ul> </section> <section id="story-plugin"> <h1>{{ trans('mg-story.plugin.title') }}</h1> - <ul class="story-links"> - <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/plugin") }}">{{ trans('mg-story.plugin.btn-add') }}</a></li> - <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/app") }}">{{ trans('mg-story.plugin.btn-app') }}</a></li> - </ul> <figure class="story-icon"> <picture> <source media="(max-width: 760px)" srcset="/img/App.svg"> @@ -91,6 +86,10 @@ </figure> <p>{{ trans('mg-story.plugin.p') }}</p> + <ul class="story-links"> + <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/plugin") }}">{{ trans('mg-story.plugin.btn-add') }}</a></li> + <li><a class="story-button" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/app") }}">{{ trans('mg-story.plugin.btn-app') }}</a></li> + </ul> </section> </div> @endsection diff --git a/resources/views/key.blade.php b/resources/views/key.blade.php index 1b66cf0f02ba685c5de512e355b887df7ce5eefe..eec467c0a73225d9dbf3054474f0059f1f8ec135 100644 --- a/resources/views/key.blade.php +++ b/resources/views/key.blade.php @@ -21,30 +21,31 @@ <p>{{ trans('key.p4') }}</p> <p>{{ trans('key.p5') }}</p> <ol> - <li>{!! trans('key.li1', ["url" => - route("startpage", [ - "key" => - empty(Cookie::get('key')) ? - "enter_key_here" : - Cookie::get('key') - ])])!!} als Startseite im Browser ein.</li> - <li>@lang('key.li2', ["url" => - route("resultpage", [ - "key" => - empty(Cookie::get('key')) ? - "enter_key_here" : - Cookie::get('key') - ]) . "&eingabe=%s"])</li> + <li> + @lang ('key.li1') + <div class="copyLink"> + <input id="loadSettings" class="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> + </li> + </br> + <li> + @lang('key.li2') + <div class="copyLink"> + <input id="searchString" class="loadSettings" type="text" value="{{route("resultpage", ["key" => $cookie]) . "&eingabe=%s"}}"> + <button class="js-only btn btn-default" onclick="var copyText = document.getElementById('searchString');copyText.select();copyText.setSelectionRange(0, 99999);document.execCommand('copy');">@lang('settings.copy')</button> + </div> + </li> </ol> </div> <div class="section"> <div id="form-wrapper"> <form method="post"> <input type="hidden" name="redirUrl" value="{{ Request::input('redirUrl', '') }}" /> - <input type="text" name="key" value="{{Cookie::get('key')}}" placeholder="@lang('key.placeholder1')" autofocus> + <input type="text" name="keyToSet" value="{{$cookie === 'enter_key_here' ? '' : $cookie}}" placeholder="@lang('key.placeholder1')" autofocus> <button type="submit" class="btn btn-success">OK</button> </form> - @if(Cookie::get('key') !== NULL) + @if($cookie !== 'enter_key_here') <form method="post" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), action('KeyController@removeKey', ['redirUrl' => url()->full()])) }}"> <input type="hidden" name="redirUrl" value="{{ Request::input('redirUrl', '') }}" /> <button type="submit" class="btn btn-default">@lang('key.removeKey')</button> diff --git a/resources/views/layouts/result.blade.php b/resources/views/layouts/result.blade.php index 3ada99dcfd0e875f0ef25f1087c98ce0929999c7..07fbc9b0fef49682b740ed95030bcfbb46389aad 100644 --- a/resources/views/layouts/result.blade.php +++ b/resources/views/layouts/result.blade.php @@ -5,7 +5,7 @@ @if( isset($result->price) && $result->price != 0) <span class="result-price">{!! $result->price_text !!}</span> @endif - <a href="{{ $result->link }}" @if($metager->isFramed())target="_top"@endif rel="noopener"> + <a href="{{ $result->link }}" target="{{ $metager->getNewtab() }}" rel="noopener"> {!! $result->titel !!} </a> </h2> @@ -16,7 +16,7 @@ @endif </div> <div class="result-subheadline"> - <a class="result-link" href="{{ $result->link }}" title="{{ $result->anzeigeLink }}" rel="noopener" @if($metager->isFramed())target="_top"@endif tabindex="-1"> + <a class="result-link" href="{{ $result->link }}" title="{{ $result->anzeigeLink }}" rel="noopener" target="{{ $metager->getNewtab() }}" tabindex="-1"> {{ $result->anzeigeLink }} </a> @if( isset($result->partnershop) && $result->partnershop === TRUE) @@ -59,7 +59,7 @@ <a class="result-open-newtab" href="{{ $result->link }}" target="_blank" rel="noopener"> {!! trans('result.options.6') !!} </a> - <a class="result-open-proxy" onmouseover="$(this).popover('show');" onmouseout="$(this).popover('hide');" data-toggle="popover" data-placement="auto right" data-container="body" data-content="@lang('result.proxytext')" href="{{ $result->proxyLink }}" target="{{ $metager->getNewtab() }}" rel="noopener"> + <a class="result-open-proxy" title="@lang('result.proxytext')" href="{{ $result->proxyLink }}" target="{{ $metager->getNewtab() }}" rel="noopener"> {!! trans('result.options.5') !!} </a> <label class="open-result-options navigation-element" for="result-toggle-{{$result->hash}}" tabindex='0'> diff --git a/resources/views/layouts/rich/ad.blade.php b/resources/views/layouts/rich/ad.blade.php deleted file mode 100644 index 7db614f4ca949f9af42477fa7df35b8481e86a46..0000000000000000000000000000000000000000 --- a/resources/views/layouts/rich/ad.blade.php +++ /dev/null @@ -1,17 +0,0 @@ -@if(isset($result) && !$apiAuthorized) -<article class="search-result ad card elevation-1"> - <div class="result-content"> - <h1 class="result-title">{{ $result->titel }}</h1> - <h2 class="result-display-link"><a href="{{ $result->link }}">{{ $result->anzeigeLink }}</a></h2> - <p class="result-description">{{ $result->descr }}</p> - <p class="result-source">Werbung von {!! $result->gefVon[0] !!}</p> - @if( isset($result->logo) ) - <img class="result-thumbnail" src="{{ $metager->getImageProxyLink($result->logo) }}" alt="" /> - @endif - </div> - <div class="result-action-area"> - <a class="result-action primary" href="{{ $result->link }}">Öffnen</a> - <a class="result-action primary" target="_blank" href="{{ $result->link }}">Neuer Tab</a> - </div> -</article> -@endif diff --git a/resources/views/layouts/rich/result.blade.php b/resources/views/layouts/rich/result.blade.php deleted file mode 100644 index c5b9d1f28f0f7924a83ec6f8497ed7813c3fc775..0000000000000000000000000000000000000000 --- a/resources/views/layouts/rich/result.blade.php +++ /dev/null @@ -1,16 +0,0 @@ -<article class="search-result card elevation-1"> - <div class="result-content"> - <h1 class="result-title">{{ $result->titel }}</h1> - <h2 class="result-display-link"><a href="{{ $result->link }}">{{ $result->anzeigeLink }}</a></h2> - <p class="result-description">{{ $result->descr }}</p> - <p class="result-source">gefunden von {!! $result->gefVon[0] !!}</p> - @if( isset($result->logo) ) - <img class="result-thumbnail" src="{{ $metager->getImageProxyLink($result->logo) }}" alt="" /> - @endif - </div> - <div class="result-action-area"> - <a class="result-action primary" href="{{ $result->link }}">Öffnen</a> - <a class="result-action primary" target="_blank" href="{{ $result->link }}">Neuer Tab</a> - <a class="result-action" target="_blank" href="{{ $result->proxyLink }}">Anonym Öffnen</a> - </div> -</article> diff --git a/resources/views/parts/searchbar.blade.php b/resources/views/parts/searchbar.blade.php index 7c071f02e308d9ce53f9cf6fffca134f06895ac8..f7abe514c3cca3a89e5f349b561607a659f6909e 100644 --- a/resources/views/parts/searchbar.blade.php +++ b/resources/views/parts/searchbar.blade.php @@ -3,8 +3,8 @@ <div class="searchbar {{$class ?? ''}}"> <div class="search-input-submit"> <div id="search-key"> - <a id="key-link" @if(isset($apiAuthorized) && $apiAuthorized)class="authorized" @else class="unauthorized"@endif href="{{ action('KeyController@index', ['redirUrl' => !empty($metager) ? $metager->generateSearchLink($metager->getFokus()) : url()->full() ]) }}" @if(!empty($metager) && $metager->isFramed())target="_top" @endif data-tooltip="{{ trans ('index.key.tooltip') }}" tabindex="0"> - <img @if(isset($apiAuthorized) && $apiAuthorized)src="/img/key-verified.svg" @else src="/img/key-icon.svg"@endif alt="" aria-hidden="true" id="searchbar-img-key"> + <a id="key-link" @if(app('App\Models\Key')->getStatus())class="authorized" @else class="unauthorized"@endif href="{{ action('KeyController@index', ['redirUrl' => !empty($metager) ? $metager->generateSearchLink($metager->getFokus()) : url()->full() ]) }}" @if(!empty($metager) && $metager->isFramed())target="_top" @endif data-tooltip="{{ trans ('index.key.tooltip') }}" tabindex="0"> + <img @if(app('App\Models\Key')->getStatus())src="/img/key-verified.svg" @else src="/img/key-icon.svg"@endif alt="" aria-hidden="true" id="searchbar-img-key"> </a> </div> <div class="search-input"> diff --git a/resources/views/plugin-page.blade.php b/resources/views/plugin-page.blade.php index f262fb346375e14fd7ec16e462b7c8eb23fb8b72..fe86fd72bcc86af80fa06620e235be4173909938 100644 --- a/resources/views/plugin-page.blade.php +++ b/resources/views/plugin-page.blade.php @@ -25,6 +25,12 @@ {{ trans('plugin-page.head.0') }} @endif </h1> + <div class="card-heavy"> + <h3>{{ trans('plugin-page.search-engine.1') }}</h3> + <ul> + <p>{{ trans('plugin-page.search-engine.2') }}</p> + </ul> + </div> @if ($agent->isDesktop()) @if ($browser === 'Firefox' || $browser === 'Mozilla') @if (version_compare($agent->version($browser), '61.', '>=')) diff --git a/resources/views/plugin/mobile/firefox/v80.blade.php b/resources/views/plugin/mobile/firefox/v80.blade.php index 2cd112ad379c5f28a818d2af8dfac0a8a1952647..ffbb95475cabdb97bc52e0ba324e255d46119644 100644 --- a/resources/views/plugin/mobile/firefox/v80.blade.php +++ b/resources/views/plugin/mobile/firefox/v80.blade.php @@ -9,9 +9,11 @@ <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.2') }}</li> <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.3') }}</li> <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.4') }}</li> - <li>{!! trans('plugin-mobile/mobile-firefox.default-search-v80.5') !!}</li> + <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.5') }}</li> <li style="list-style:none;">{{ trans('plugin-mobile/mobile-firefox.search-string') }}</li> <code>{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), route("resultpage", ["eingabe" => ""])) }}%s</code> + <li>{!! trans('plugin-mobile/mobile-firefox.default-search-v80.6') !!}</li> + <li>{{ trans('plugin-mobile/mobile-firefox.default-search-v80.7') }}</li> </ol> </div> diff --git a/resources/views/resultpages/metager3resultsatom10.blade.php b/resources/views/resultpages/metager3resultsatom10.blade.php index 25df6e410513b4f15a9f0dc0cc42797533a71995..e373265aaab7715b7f890b08722f07ae680b0ffd 100644 --- a/resources/views/resultpages/metager3resultsatom10.blade.php +++ b/resources/views/resultpages/metager3resultsatom10.blade.php @@ -3,7 +3,7 @@ xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:mg="http://metager.de/opensearch/" xmlns:ad="http://a9.com/-/opensearch/extensions/advertisement/1.0/"> - <title>{!! htmlspecialchars($eingabe, ENT_XML1, 'UTF-8'); !!} - MetaGer</title> + <title>{{ htmlspecialchars($eingabe, ENT_XML1, 'UTF-8') }} - MetaGer</title> <link href="{{ url()->full() }}"/> <updated>{{ date('c') }}</updated> <opensearch:totalResults>{{ $resultcount }}</opensearch:totalResults> @@ -11,7 +11,6 @@ <link rel="next" href="{{ htmlspecialchars($metager->nextSearchLink() ,ENT_QUOTES) }}" type="application/atom+xml"/> <id>urn:uuid:1d634a8c-2764-424f-b082-6c96494b7240</id> @include('layouts.atom10ad', ['ad' => $metager->popAd()]) - @if($apiAuthorized) @foreach($metager->getResults() as $index => $result) @if(($index+1) % 5 === 0) @include('layouts.atom10ad', ['ad' => $metager->popAd()]) @@ -25,13 +24,4 @@ </content> </entry> @endforeach - @else - <ad:advertisement> - <ad:callOut type="TEXT">Fehler</ad:callOut> - <ad:title type="TEXT">Falscher Schlüssel angegeben</ad:title> - <ad:displayUrl type="TEXT">https://metager.de/meta/key</ad:displayUrl> - <ad:subTitle type="TEXT">Sie haben einen ungültigen Schlüssel angegeben</ad:subTitle> - <link href="https://metager.de/meta/key" /> - </ad:advertisement> - @endif </feed> diff --git a/resources/views/resultpages/metager3resultsrss20.blade.php b/resources/views/resultpages/metager3resultsrss20.blade.php deleted file mode 100644 index 28e2e0149b83cf2605e3f9598fa363f025f6e08c..0000000000000000000000000000000000000000 --- a/resources/views/resultpages/metager3resultsrss20.blade.php +++ /dev/null @@ -1,24 +0,0 @@ -<?xmlversion = "1.0"encoding = "UTF-8"?> - <rss version="2.0" - xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" - xmlns:mg="http://metager.de/opensearch/" - xmlns:atom="http://www.w3.org/2005/Atom"> - <channel> - <title>{!! htmlspecialchars($eingabe, ENT_XML1, 'UTF-8'); !!} - MetaGer</title> - <opensearch:totalResults>{{ $resultcount }}</opensearch:totalResults> - <opensearch:Query role="request" searchTerms="{{ htmlspecialchars($eingabe, ENT_QUOTES) }}"/> - <mg:nextSearchResults url="{{htmlspecialchars($metager->nextSearchLink() ,ENT_QUOTES)}}" /> - @if($apiAuthorized) - @foreach($metager->getResults() as $result) - <item> - <title>{!! htmlspecialchars($result->titel, ENT_XML1, 'UTF-8'); !!}</title> - <link>{!! htmlspecialchars($result->link, ENT_XML1, 'UTF-8'); !!}</link> - <mg:anzeigeLink>{!! htmlspecialchars($result->anzeigeLink, ENT_XML1, 'UTF-8'); !!}</mg:anzeigeLink> - <description> - {!! htmlspecialchars($result->longDescr, ENT_XML1, 'UTF-8'); !!} - </description> - </item> - @endforeach - @endif - </channel> - </rss> diff --git a/resources/views/resultpages/metager3rich.blade.php b/resources/views/resultpages/metager3rich.blade.php deleted file mode 100644 index 840e9772c9a7eb13d59aae2d9883467ca2bb8253..0000000000000000000000000000000000000000 --- a/resources/views/resultpages/metager3rich.blade.php +++ /dev/null @@ -1,59 +0,0 @@ -<!DOCTYPE html> -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <meta charset="UTF-8" /> - <meta http-equiv="X-UA-Compatible" content="IE=edge" /> - <title>{{ $eingabe }} - MetaGer</title> - <link @if(app('request')->input('theme', 'default')!=='default'&&app('request')->input('theme', 'default')!=='material')rel="alternate stylesheet" @else rel="stylesheet" @endif title="Material" href="{{ mix('/css/material-default.css') }}" /> - <link @if(app('request')->input('theme', 'default')!=='material-inverse')rel="alternate stylesheet" @else rel="stylesheet" @endif title="Material-Invers" href="{{ mix('/css/material-inverse.css') }}" /> - <link href="/font-awesome/css/font-awesome.min.css" rel="stylesheet" /> - <link href="/favicon.ico" rel="icon" type="image/x-icon" /> - <link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" /> - <meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport" /> - <meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE" /> - <link rel="search" type="application/opensearchdescription+xml" title="{!! trans('resultPage.opensearch') !!}" href="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), action('StartpageController@loadPlugin', ['params' => base64_encode(serialize(Request::all()))])) }}"> - </head> - <body> - <header class="persistent-search"> - <form class="search-card card elevation-2"> - <a href="/" class="back"> - <img src="/img/Logo-square-inverted.svg" alt="MetaGer" title="MetaGer, die sichere Suchmaschine" /> - </a> - <input type="text" name="eingabe" placeholder="MetaGer-Suche" value="{{ $eingabe }}" class="query-input"/> - <button type="submit" class="search-button fa"></button> - @foreach( $metager->request->all() as $key => $value) - @if($key !== "eingabe" && $key !== "page" && $key !== "next") - <input type="hidden" name="{{ $key }}" value="{{ $value }}"/> - @endif - @endforeach - </form> - </header> - <details class="focus-card card elevation-1"> - <summary class="focus-cell"><div class="focus-cell-label"><span class="icon fa" aria-hidden="true"></span> <b>Web</b></div></summary> - </details> - <main class="results-container"> - @foreach($metager->getResults() as $result) - @if($result->number % 7 === 0 && !$apiAuthorized) - @include('layouts.rich.ad', ['result' => $metager->popAd()]) - @endif - @include('layouts.rich.result', ['result' => $result]) - @endforeach - </main> - @if($metager->getPage() === 1) - <nav class="pagenav-first"> - <a class="pagenav-button-next card elevation-1" href="{{ $metager->nextSearchLink() }}"><span class="card-button-text">Weitersuchen</span><span class="icon-right">â–º</span></a> - </nav> - @else - <nav class="pagenav-following"> - <div> - <a class="pagenav-button-first card-inline elevation-1" href="javascript:history.back()">â—„</a> - </div> - <div class="pagenav-current"><span class="pagenav-current-annotation">Seite </span>{{ $metager->getPage() }}</div> - <a class="pagenav-button-next card-inline elevation-1" href="{{ $metager->nextSearchLink() }}"><span class="card-button-text">Weitersuchen</span><span class="icon-right">â–º</span></a> - </nav> - @endif - <footer class="footer-text"> - <a href="https://metager.de/impressum" target="_blank">Impressum</a> - </footer> - </body> -</html> diff --git a/resources/views/settings/allSettings.blade.php b/resources/views/settings/allSettings.blade.php index 0eb677d10a271c88e8e853a6e6cb49a3e11df9d6..eb8ae22350d6addb9c57a899e8645f3875bb3b31 100644 --- a/resources/views/settings/allSettings.blade.php +++ b/resources/views/settings/allSettings.blade.php @@ -20,7 +20,7 @@ <tbody> @foreach(Cookie::get() as $key => $value) <tr> - <td>{{ $key . "=" . $value }}</td> + <td>{{ $key . " = " . $value }}</td> <td> @if(strpos($key, "_engine_") !== FALSE) @lang('settings.engineDisabled', ["engine" => $sumaFile->sumas->{substr($key, strrpos($key, "_")+1)}->{"display-name"}, "focus" => trans('index.foki.' . substr($key, 0, strpos($key, "_")))]) @@ -31,11 +31,13 @@ @endif @endforeach @elseif($key === "key") - @lang('settings.key') + @lang('settings.key') @elseif(strpos($key, "_blpage")) - @lang('settings.blentry') + @lang('settings.blentry') @elseif($key === 'dark_mode') - @lang('settings.dm') + @lang('settings.darkmode') + @elseif($key === 'new_tab') + @lang('settings.newTab') @endif </td> <td> diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php index 94ee61fceee304fe2aa59021510ce64c3e3fca17..cf82c1a47a4619958344af022f4033467e81dbcd 100644 --- a/resources/views/settings/index.blade.php +++ b/resources/views/settings/index.blade.php @@ -12,8 +12,8 @@ <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}}"> + <div class="copyLink"> + <input id="loadSettings" class="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> @@ -125,6 +125,7 @@ <div class="card-light"> <h2>Weitere Einstellungen</h2> + <p>@lang('settings.hint')</p> <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 }}"> @@ -135,14 +136,20 @@ <option value="off" {{ Cookie::get('dark_mode') === "1" ? "disabled selected" : "" }}>@lang('settings.light')</option> <option value="on" {{ Cookie::get('dark_mode') === "2" ? "disabled selected" : "" }}>@lang('settings.dark')</option> </select> - <small>@lang('settings.darkmode-hint')</small> + </div> + <div class="form-group"> + <label for="nt">@lang('settings.newTab')</label> + <select name="nt" id="nt" class="form-control"> + <option value="off" {{ !Cookie::has('new_tab') ? "disabled selected" : "" }}>@lang('settings.off')</option> + <option value="on" {{ Cookie::get('new_tab') === "on" ? "disabled selected" : "" }}>@lang('settings.on')</option> + </select> </div> @if(LaravelLocalization::getCurrentLocale() === "de") <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> + <option value="on" @if(Cookie::get("zitate") === null)disabled selected @endif>Anzeigen</option> + <option value="off" {{ Cookie::get("zitate") === "off" ? "disabled selected" : "" }}>Nicht Anzeigen</option> </select> </div> @endif diff --git a/resources/views/team/team.blade.php b/resources/views/team/team.blade.php index da1af7fcae6d4bcc1144e972e3ffc6591edff3dd..e83439ccdd0826b7e6ebf586ed3ed511bbce8d3d 100644 --- a/resources/views/team/team.blade.php +++ b/resources/views/team/team.blade.php @@ -16,7 +16,7 @@ <a href="mailto:carsten@suma-ev.de">carsten@suma-ev.de</a></p> </li> <li> - <p>Branz, Manuela - {!! trans('team.role.3') !!} & {!! trans('team.role.2') !!} - + <p>Branz, Manuela - {!! trans('team.role.1.1') !!} & {!! trans('team.role.3') !!} - <a href="mailto:manuela.branz@suma-ev.de">manuela.branz@suma-ev.de</a></p> </li> <li> @@ -35,6 +35,13 @@ <p><a href="https://de.wikipedia.org/wiki/Wolfgang_Sander-Beuermann" target="_blank" rel="noopener">Sander-Beuermann, Wolfgang</a>, Dr.-Ing - {!! trans('team.role.8') !!} - <a href="mailto:wsb@suma-ev.de">wsb@suma-ev.de</a> </li> + <li> + <p>{!! trans('team.role.2') !!}: Branz, Manuela + <a href="mailto:manuela.branz@suma-ev.de">manuela.branz@suma-ev.de</a></p> + </li> + + + </ul> </div> <div class="card-heavy"> diff --git a/routes/web.php b/routes/web.php index 875b21d7f2f49d35c24081b0bb4bcf5ff88f289e..da5dae281108282da61ea83896f0d34393a1172e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -191,6 +191,9 @@ Route::group( Route::post('queryregexp', 'AdminSpamController@queryregexp'); Route::post('deleteRegexp', 'AdminSpamController@deleteRegexp'); }); + Route::post('service-desk', 'ServiceDesk@webhook'); + Route::get('stress', 'Stresstest@index'); + Route::get('stress/verify', 'Stresstest@index')->middleware('browserverification', 'humanverification'); }); Route::get('settings', function () { @@ -218,7 +221,7 @@ Route::group( $redis->expire($key, 30); }); - return response(view('layouts.resultpage.verificationCss'), 200)->header("Content-Type", "text/css"); + return response("", 200)->header("Content-Type", "application/js"); }); Route::get('meta/picture', 'Pictureproxy@get'); @@ -256,7 +259,7 @@ Route::group( try { $fh = fopen("https://gitlab.metager.de/open-source/app-en/-/raw/latest/app/release_manual/app-release_manual.apk", "r"); while (!feof($fh)) { - echo (fread($fh, 1024)); + echo(fread($fh, 1024)); } } catch (\Exception $e) { abort(404); @@ -273,7 +276,7 @@ Route::group( try { $fh = fopen("https://gitlab.metager.de/open-source/metager-maps-android/raw/latest/app/release/app-release.apk?inline=false", "r"); while (!feof($fh)) { - echo (fread($fh, 1024)); + echo(fread($fh, 1024)); } } catch (\Exception $e) { abort(404); @@ -302,4 +305,5 @@ Route::group( return response($result, 200) ->header('Content-Type', RenderTextFormat::MIME_TYPE); }); - }); + } +); diff --git a/tests/Browser/Pages/Widget.php b/tests/Browser/Pages/Widget.php index 4a3d927a0f53b3c1288eb37c2a64d58e75ce197f..f76e540e3defd5c3964a01cf829d0b5637246301 100644 --- a/tests/Browser/Pages/Widget.php +++ b/tests/Browser/Pages/Widget.php @@ -31,7 +31,7 @@ class Widget extends Page ->waitForText("MetaGer for usage on your website. Please choose the scope of your widget:") ->assertTitle("MetaGer Widget") ->switchLanguage("Español") - ->waitForText("MetaGer: un motor de búsqueda for suyo sitio web. Selecciona por favor:") + ->waitForText("MetaGer para la integración en su sitio web. Para hacer esto, seleccione dónde buscar:") ->assertTitle("MetaGer Widget") ->switchLanguage("Deutsch");