Commit a86e3654 authored by Dominik Hebeler's avatar Dominik Hebeler

Merge branch 'development' into 'master'

Development

See merge request !1627
parents 3dbc4ca4 9d3ab4f4
......@@ -3,7 +3,7 @@ APP_DEBUG=true
APP_LOG_LEVEL=debug
LOG_CHANNEL=stderr
APP_KEY=
APP_URL=http://localhost
APP_URL=http://nginx
BOT_PROTECTION=true
......@@ -37,3 +37,7 @@ MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=
PROJECT_NAME=MetaGer
BRANCH_NAME=Local
COMMIT_NAME=Testing
\ No newline at end of file
......@@ -30,6 +30,7 @@ stages:
- incremental rollout 50%
- incremental rollout 100%
- performance
- integrationtest
- cleanup
......@@ -129,7 +130,7 @@ prepare_composer:
stage: prepare
image: prooph/composer:7.3
script:
- composer install
- composer install --no-dev
artifacts:
paths:
- vendor
......@@ -201,3 +202,18 @@ production:
ROLLOUT_RESOURCE_TYPE: deployment
environment:
url: https://metager.de
integrationtest:
stage: integrationtest
image:
name: prooph/composer:7.3
entrypoint: ["/bin/sh"]
script:
# Install Dev Dependencies
- composer install
- URL=$(cat environment_url.txt | tr -d '\n')
- sed -i "s#^APP_URL=.*#APP_URL=$URL#g" .env
- sed -i "s#^BRANCH_NAME=.*#BRANCH_NAME=$CI_COMMIT_REF_NAME#g" .env
- sed -i "s#^COMMIT_NAME=.*#COMMIT_NAME=$CI_COMMIT_REF_SLUG#g" .env
- ./vendor/phpunit/phpunit/phpunit
<?php
namespace App;
use BrowserStack\Local;
use Facebook\WebDriver\Remote\RemoteWebDriver;
class Browserstack
{
private $webdriver, $bs_local = null;
private $LOCALCAPABILITIES = array();
private $CAPABILITIES = array();
public function __construct()
{
$this->setCapabilities();
$caps = null;
if ($this->isLocal()) {
$caps = $this->LOCALCAPABILITIES;
$this->bs_local = new Local();
$bs_local_args = array("key" => env("WEBDRIVER_KEY", ""));
$this->bs_local->start($bs_local_args);
} else {
$caps = $this->CAPABILITIES;
}
$this->webdriver = RemoteWebDriver::create(
getenv("WEBDRIVER_URL"),
$caps
);
}
private function setCapabilities()
{
$this->LOCALCAPABILITIES = array(
"os" => "Windows",
"os_version" => "10",
"browser" => "Firefox",
"browser_version" => "79.0 beta",
"resolution" => "1920x1080",
"project" => env("PROJECT_NAME", "Not Set"),
"build" => env("BRANCH_NAME", "Not Set"),
"name" => env("COMMIT_NAME", "Not Set"),
"browserstack.local" => "true",
"browserstack.console" => "verbose",
"browserstack.networkLogs" => "true",
"browserstack.timezone" => "Europe/Berlin",
"browserstack.selenium_version" => "3.5.2",
);
$this->CAPABILITIES = array(
"os" => "Windows",
"os_version" => "10",
"browser" => "Firefox",
"browser_version" => "79.0 beta",
"resolution" => "1920x1080",
"project" => env("PROJECT_NAME", "Not Set"),
"build" => env("BRANCH_NAME", "Not Set"),
"name" => env("COMMIT_NAME", "Not Set"),
"browserstack.local" => "false",
"browserstack.console" => "verbose",
"browserstack.networkLogs" => "true",
"browserstack.timezone" => "Europe/Berlin",
"browserstack.selenium_version" => "3.5.2",
);
}
public function getWebdriver()
{
return $this->webdriver;
}
public function shutdown()
{
$this->webdriver->quit();
if ($this->bs_local != null) {
$this->bs_local->stop();
}
}
private function isLocal()
{
return env("APP_URL", "") === "http://nginx";
}
}
......@@ -30,9 +30,11 @@ class MailController extends Controller
$validator = Validator::make(
[
'email' => $request->input('email'),
'pcsrf' => $request->input('pcsrf'),
],
[
'email' => 'required|email',
'pcsrf' => ['required', 'string', new \App\Rules\PCSRF],
]
);
......
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PCSRF implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
// Nobody wants to fight through hundreds of mails every day regarding
// oranges or 60m rinse hoses
// However CSRF requires some sort of user session which we want to avoid
// That's why we implement a similar but easier to bypass method of pseudo CSRF
// $value should contain a base64 encoded timestamp
if (base64_encode(base64_decode($value, true)) !== $value) {
return false;
} else {
$value = base64_decode($value, true);
}
if (\is_int($value)) {
return false;
} else {
$value = intval($value);
}
$currentTime = \time();
// If the request was sent faster than 5 seconds or if it took longer than one hour we assume it's spam
if (($currentTime - 5) <= $value || ($currentTime - 3600) >= $value) {
return false;
}
return true;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return trans("validation.pcsrf");
}
}
......@@ -68,3 +68,11 @@ services:
volumes:
- .:/html
command: "su -s /bin/sh -c 'php artisan requests:fetcher' nginx"
test:
depends_on:
- "phpfpm"
image: php:7.3-cli
working_dir: /html
volumes:
- .:/html
command: "./vendor/phpunit/phpunit/phpunit"
/bin/sh: 1: ps: not found
/bin/sh: 1: ps: not found
Thu Jul 09 2020 11:17:18 GMT+0000 (UTC) -- [INFO] Started the BrowserStack Binary server on 45691, PID: 22
Thu Jul 09 2020 11:17:19 GMT+0000 (UTC) -- [SUCCESS] You can now access your local server(s) in our remote browser
Thu Jul 09 2020 11:17:19 GMT+0000 (UTC) -- Press Ctrl-C to exit
......@@ -141,13 +141,13 @@ Results.prototype.addToContainer = function (container) {
var options = $('\
<div id="saver-options">\
<div class="saver-option saver-option-filter">\
<input class="form-control" type="text" placeholder="&#xf0b0 ' + t('result-saver.filter') + '">\
<input style="font-family: \'Font Awesome 5 Free\', sans-serif;" class="form-control" type="text" placeholder="&#xf0b0 ' + t('result-saver.filter') + '">\
</div>\
<div class="saver-option saver-option-sort">\
<select class="form-control" style="font-family: FontAwesome, sans-serif;">\
<option value="chronological" style="font-family: FontAwesome, sans-serif;">&#xf017 ' + t('result-saver.sort.chronological') + '</option>\
<option value="rank" style="font-family: FontAwesome, sans-serif;">&#xf162 ' + t('result-saver.sort.ranking') + '</option>\
<option value="alphabetical" style="font-family: FontAwesome, sans-serif;">&#xf15d ' + t('result-saver.sort.alphabetical') + '</option>\
<select class="form-control" style="font-family: \'Font Awesome 5 Free\', sans-serif;">\
<option value="chronological" style="font-family: \'Font Awesome 5 Free\', sans-serif;">&#xf017 ' + t('result-saver.sort.chronological') + '</option>\
<option value="rank" style="font-family: \'Font Awesome 5 Free\', sans-serif;">&#xf162 ' + t('result-saver.sort.ranking') + '</option>\
<option value="alphabetical" style="font-family: \'Font Awesome 5 Free\', sans-serif;">&#xf15d ' + t('result-saver.sort.alphabetical') + '</option>\
</select>\
</div>\
<div class="saver-option saver-option-delete">\
......
......@@ -7,7 +7,7 @@ return [
'role.3' => 'Pressereferentin',
'role.4' => 'Programmierer',
'role.5' => 'Programmierer',
'role.6' => 'Programmierer',
'role.6' => 'Programmiererin',
'role.7' => 'Sekretariat',
'role.8' => 'Founder',
......
<?php
return [
"accepted" => "Das Feld :attribute muss akzeptiert werden.",
"active_url" => "Das Feld :attribute ist keine richtige URL.",
"after" => "Das Feld :attribute muss ein Datum nach :date sein.",
"alpha" => "Das Feld :attribute darf nur Buchstaben enthalten.",
"alpha_dash" => "Das Feld :attribute darf nur Buchstaben, Zahlen und Gedankenstriche enthalten.",
"alpha_num" => "Das Feld :attribute darf nur Buchstaben und Zahlen enthalten.",
"array" => "Das Feld :attribute muss ein Array sein.",
"before" => "Das Feld :attribute muss ein Datum vor :date sein.",
"between" => [
"numeric" => "Das Feld :attribute muss zwischen :min und :max liegen.",
"file" => "Die Datei :attribute muss zwischen :min und :max Kilobyte groß sein.",
"string" => "Das Feld :attribute muss zwischen :min und :max Zeichen haben.",
"array" => "Das Array :attribute muss zwischen :min und :max Elemente haben."
"accepted" => "Das Feld :attribute muss akzeptiert werden.",
"active_url" => "Das Feld :attribute ist keine richtige URL.",
"after" => "Das Feld :attribute muss ein Datum nach :date sein.",
"alpha" => "Das Feld :attribute darf nur Buchstaben enthalten.",
"alpha_dash" => "Das Feld :attribute darf nur Buchstaben, Zahlen und Gedankenstriche enthalten.",
"alpha_num" => "Das Feld :attribute darf nur Buchstaben und Zahlen enthalten.",
"array" => "Das Feld :attribute muss ein Array sein.",
"before" => "Das Feld :attribute muss ein Datum vor :date sein.",
"between" => [
"numeric" => "Das Feld :attribute muss zwischen :min und :max liegen.",
"file" => "Die Datei :attribute muss zwischen :min und :max Kilobyte groß sein.",
"string" => "Das Feld :attribute muss zwischen :min und :max Zeichen haben.",
"array" => "Das Array :attribute muss zwischen :min und :max Elemente haben.",
],
"boolean" => "Das Feld :attribute muss entweder \"true\", oder \"false\" sein.",
"confirmed" => "Die Bestätigung des Feldes :attribute stimmt nicht überein.",
"date" => "Das Feld :attribute ist kein korrektes Datum.",
"date_format" => "Das Feld :attribute stimmt nicht mit dem Format :format überein.",
"different" => "Das Feld :attribute und :other müssen unterschiedlich sein.",
"digits" => "Das Feld :attribute muss :digits Ziffern enthalten.",
"digits_between" => "Das Feld :attribute muss zwischen :min und :max Ziffern enthalten.",
"distinct" => "Das Feld :attribute kommt doppelt vor.",
"email" => "Das Feld :attribute muss eine korrekte Email-Adresse sein.",
"exists" => "Das gewählte Feld :attribute existiert nicht.",
"filled" => "Das Feld :attribute wird benötigt.",
"image" => "Das Feld :attribute muss ein gültiges Bild sein.",
"in" => "Das gewählte Feld :attribute existiert nicht.",
"in_array" => "Das Feld :attribute existiert nicht in :other.",
"integer" => "Das Feld :attribute muss ein Integer sein.",
"ip" => "Das Feld :attribute muss eine gültige IP Adresse sein.",
"json" => "Das Feld :attribute muss ein gültiger JSON String sein.",
"max" => [
"numeric" => "Das Feld :attribute darf nicht größer sein als :max.",
"file" => "Das Feld :attribute darf nicht größer sein als :max Kilobyte",
"string" => "Das Feld :attribute darf nicht mehr als :max Zeichen enthalten.",
"array" => "Das Feld :attribute darf nicht mehr als :max Elemente enthalten."
"boolean" => "Das Feld :attribute muss entweder \"true\", oder \"false\" sein.",
"confirmed" => "Die Bestätigung des Feldes :attribute stimmt nicht überein.",
"date" => "Das Feld :attribute ist kein korrektes Datum.",
"date_format" => "Das Feld :attribute stimmt nicht mit dem Format :format überein.",
"different" => "Das Feld :attribute und :other müssen unterschiedlich sein.",
"digits" => "Das Feld :attribute muss :digits Ziffern enthalten.",
"digits_between" => "Das Feld :attribute muss zwischen :min und :max Ziffern enthalten.",
"distinct" => "Das Feld :attribute kommt doppelt vor.",
"email" => "Das Feld :attribute muss eine korrekte Email-Adresse sein.",
"exists" => "Das gewählte Feld :attribute existiert nicht.",
"filled" => "Das Feld :attribute wird benötigt.",
"image" => "Das Feld :attribute muss ein gültiges Bild sein.",
"in" => "Das gewählte Feld :attribute existiert nicht.",
"in_array" => "Das Feld :attribute existiert nicht in :other.",
"integer" => "Das Feld :attribute muss ein Integer sein.",
"ip" => "Das Feld :attribute muss eine gültige IP Adresse sein.",
"json" => "Das Feld :attribute muss ein gültiger JSON String sein.",
"max" => [
"numeric" => "Das Feld :attribute darf nicht größer sein als :max.",
"file" => "Das Feld :attribute darf nicht größer sein als :max Kilobyte",
"string" => "Das Feld :attribute darf nicht mehr als :max Zeichen enthalten.",
"array" => "Das Feld :attribute darf nicht mehr als :max Elemente enthalten.",
],
"mimes" => "Das Feld :attribute muss eine Datei vom Typ: :values sein.",
"min" => [
"numeric" => "Die Zahl :attribute muss mindestens :min sein.",
"file" => "Die Datei :attribute muss midnestens :min Kilobyte groß sein.",
"string" => "Der Text :attribute muss mindestens :min Zeichen enthalten.",
"array" => "das Array :attribute muss mindestens :min Elemente enthalten."
"mimes" => "Das Feld :attribute muss eine Datei vom Typ: :values sein.",
"min" => [
"numeric" => "Die Zahl :attribute muss mindestens :min sein.",
"file" => "Die Datei :attribute muss midnestens :min Kilobyte groß sein.",
"string" => "Der Text :attribute muss mindestens :min Zeichen enthalten.",
"array" => "das Array :attribute muss mindestens :min Elemente enthalten.",
],
"not_in" => "Das gewählte Feld :attribute is nicht vorhanden.",
"numeric" => "Das Feld :attribute muss eine Zahl sein.",
"present" => "Das Feld :attribute muss angegeben werden.",
"regex" => "Das Feld :attribute hat ein ungültiges format.",
"required" => "Das Feld :attribute wird benötigt.",
"required_if" => "Das Feld :attribute wird benötigt, wenn :other :value ist.",
"required_unless" => "Das Feld :attribute wird benötigt wenn :other in :values vorhanden ist.",
"required_with" => "Das Feld :attribute wird benötigt, wenn :values angegeben wurde.",
"required_with_all" => "Das Feld :attribute wird benötigt, wenn :values angegeben wurden.",
"required_without" => "Das Feld :attribute wird benötigt, wenn :values nicht angegeben wurde.",
"required_without_all" => "Das Feld :attribute wird benötigt, wenn keins der folgenden angegeben wurde: :values.",
"same" => "Das Feld :attribute und :other müssen übereinstimmten.",
"size" => [
"numeric" => "Das Feld :attribute muss mindestens :size sein.",
"file" => "Das Feld :attribute muss mindestens :size Kilobyte groß sein.",
"string" => "Das Feld :attribute muss mindestens :size Zeichen lang sein.",
"array" => "Das Feld :attribute muss mindestens :size Elemente enthalten."
"not_in" => "Das gewählte Feld :attribute is nicht vorhanden.",
"numeric" => "Das Feld :attribute muss eine Zahl sein.",
"present" => "Das Feld :attribute muss angegeben werden.",
"regex" => "Das Feld :attribute hat ein ungültiges format.",
"required" => "Das Feld :attribute wird benötigt.",
"required_if" => "Das Feld :attribute wird benötigt, wenn :other :value ist.",
"required_unless" => "Das Feld :attribute wird benötigt wenn :other in :values vorhanden ist.",
"required_with" => "Das Feld :attribute wird benötigt, wenn :values angegeben wurde.",
"required_with_all" => "Das Feld :attribute wird benötigt, wenn :values angegeben wurden.",
"required_without" => "Das Feld :attribute wird benötigt, wenn :values nicht angegeben wurde.",
"required_without_all" => "Das Feld :attribute wird benötigt, wenn keins der folgenden angegeben wurde: :values.",
"same" => "Das Feld :attribute und :other müssen übereinstimmten.",
"size" => [
"numeric" => "Das Feld :attribute muss mindestens :size sein.",
"file" => "Das Feld :attribute muss mindestens :size Kilobyte groß sein.",
"string" => "Das Feld :attribute muss mindestens :size Zeichen lang sein.",
"array" => "Das Feld :attribute muss mindestens :size Elemente enthalten.",
],
"string" => "Das Feld :attribute muss ein String sein.",
"timezone" => "Das Feld :attribute muss eine gültige Zeitzone sein.",
"unique" => "Das Feld :attribute wurde schon verwendet.",
"url" => "Das Feld :attribute hat ein ungültiges Format.",
"custom" => [
"attribute-name" => [
"rule-name" => "eigene-nachricht"
]
"string" => "Das Feld :attribute muss ein String sein.",
"timezone" => "Das Feld :attribute muss eine gültige Zeitzone sein.",
"unique" => "Das Feld :attribute wurde schon verwendet.",
"url" => "Das Feld :attribute hat ein ungültiges Format.",
"custom" => [
"attribute-name" => [
"rule-name" => "eigene-nachricht",
],
],
"dimensions" => ":attribute hat die falsche Größe.",
"file" => "Das Feld :attribute muss eine Datei sein.",
"mimetypes" => "Das Feld :attribute muss eine Datei vom Typ :values sein.",
"uploaded" => ":attribute konnte nicht hochgeladen werden."
];
\ No newline at end of file
"dimensions" => ":attribute hat die falsche Größe.",
"file" => "Das Feld :attribute muss eine Datei sein.",
"mimetypes" => "Das Feld :attribute muss eine Datei vom Typ :values sein.",
"uploaded" => ":attribute konnte nicht hochgeladen werden.",
"pcsrf" => "Das hat leider nicht geklappt. Bitte versuchen Sie es noch einmal.",
];
......@@ -11,78 +11,78 @@ return [
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'The :attribute must be an array.',
'before' => 'The :attribute must be a date before :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field is required.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'The :attribute confirmation does not match.',
'date' => 'The :attribute is not a valid date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field is required.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'json' => 'The :attribute must be a valid JSON string.',
'max' => [
'numeric' => 'The :attribute may not be greater than :max.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
'file' => 'The :attribute may not be greater than :max kilobytes.',
'string' => 'The :attribute may not be greater than :max characters.',
'array' => 'The :attribute may not have more than :max items.',
],
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values is present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'size' => [
'same' => 'The :attribute and :other must match.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
],
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
/*
|--------------------------------------------------------------------------
......@@ -93,7 +93,7 @@ return [
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
*/
'custom' => [
'attribute-name' => [
......@@ -110,8 +110,8 @@ return [
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
*/
'attributes' => [],
"pcsrf" => "Unfortunately this did not work. Please try again.",
];
......@@ -14,12 +14,12 @@ return [
"plugin" => "Añadir MetaGer-Plugin",
"plugin-title" => "Añadir MetaGer a su navegador",
'about.1.1' => "Privacidad garantizada",
'about.1.2' => 'Con nosotros usted tiene control total sobre sus datos.',
'about.2.1' => 'Asociación sin ánimo de lucro',
'about.2.2' => '¡Nosotros como SUMA-EV somos independientes porque no perseguimos intereses comerciales!',
'about.3.1' => 'Apoyar y Donar',
'about.3.2' => 'Con su donación usted apoya el trabajo de SUMA-EV y el funcionamiento de MetaGer.',
'about.4.1' => '¡Únete!',
'about.4.2' => 'Fortalécenos haciéndote miembro.',
'about.1.2' => 'Con nosotros tiene control total sobre sus datos. No rastreamos y nuestro código fuente es gratuito.',
'about.2.1' => 'Diversa y libre',
'about.2.2' => 'MetaGer protege contra la censura al combinar los resultados de múltiples motores de búsqueda.',
'about.3.1' => 'Energía 100% renovable',
'about.3.2' => 'Todos nuestros servicios se ejecutan con energía renovable. Sostenible y limpio.',
'about.4.1' => 'Organización sin ánimo de lucro',
'about.4.2' => '¡Fortalécenos convirtiéndote en miembro o donando a nuestra organización sin fines de lucro!',
"placeholder" => "MetaGer: Buscar & encontrar seguro",
];
......@@ -15,6 +15,7 @@
@endif
<form class="contact" name="contact" method="post" action="{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "/kontakt") }}">
{{ csrf_field() }}
<input type="hidden" name="pcsrf" value="{{ base64_encode(\time()) }}">
<div class="form-group kontakt-form-group">
<input class="form-control" name="name" placeholder="{!!trans('kontakt.form.name')!!}" type="text" required @if(isset($formerrors) && Request::has('name'))value="{{Request::input('name')}}"@endif>
</div>
......