Files
opensourcepos/app/Language/de-DE/Config.php
Ollama 8da4aff262 fix(security): prevent command injection in sendmail path configuration
Add validation for the mailpath POST parameter to prevent command injection
attacks. The path is validated to only allow alphanumeric characters,
underscores, dashes, forward slashes, and dots.

- Required mailpath when protocol is "sendmail"
- Validates format for all non-empty mailpath values
- Blocks common injection vectors: ; | & ` $() spaces newlines
- Added mailpath_invalid translation to all 43 language files
- Simplified validation logic to avoid redundant conditions

Files changed:
- app/Controllers/Config.php: Add regex validation with protocol check
- app/Language/*/Config.php: Add mailpath_invalid error message (43 languages)
- tests/Controllers/ConfigTest.php: Unit tests for validation
2026-04-06 18:37:07 +00:00

333 lines
25 KiB
PHP

<?php
return [
"address" => "Adresse",
"address_required" => "Adresse ist erforderlich.",
"all_set" => "All file permissions are set correctly!",
"allow_duplicate_barcodes" => "Erlaube doppelte Barcodes",
"apostrophe" => "Apostroph",
"backup_button" => "Sicherung",
"backup_database" => "Sicherungs-Datenbank",
"barcode" => "Barcodes",
"barcode_company" => "Firmenname",
"barcode_configuration" => "Barcodes",
"barcode_content" => "Barcode Inhalt",
"barcode_first_row" => "Erste Zeile",
"barcode_font" => "Schrift",
"barcode_formats" => "Eingabeformate",
"barcode_generate_if_empty" => "Generiere Barcode wenn leer.",
"barcode_height" => "Höhe",
"barcode_id" => "Artikel-Nr/Name",
"barcode_info" => "Barcode Einstellung",
"barcode_layout" => "Barcode-Layout",
"barcode_name" => "Name",
"barcode_number" => "UPC/EAN/ISBN",
"barcode_number_in_row" => "Nummer in Zeile",
"barcode_page_cellspacing" => "Zellenabstand auf Seite.",
"barcode_page_width" => "Seitenbreite",
"barcode_price" => "Preis",
"barcode_second_row" => "Zeile 2",
"barcode_third_row" => "Zeile 3",
"barcode_tooltip" => "Warnung: Diese Funktion kann dazu führen, dass doppelte Elemente importiert oder erstellt werden. Nicht verwenden, wenn Sie keine doppelten Barcodes wünschen.",
"barcode_type" => "Barcode Typ",
"barcode_width" => "Breite (px)",
"bottom" => "Unten",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "Bargeld Dezimalstellen",
"cash_decimals_tooltip" => "Wenn Währung und Bargeld die gleiche Anzahl Dezimalstellen haben, wird nicht gerundet.",
"cash_rounding" => "Bargeld Rundung",
"category_dropdown" => "",
"center" => "Mitte",
"change_apperance_tooltip" => "",
"comma" => "Komma",
"company" => "Firmenname",
"company_avatar" => "",
"company_change_image" => "Bild ändern",
"company_logo" => "Logo",
"company_remove_image" => "Bild löschen",
"company_required" => "Firmenname ist erforderlich",
"company_select_image" => "Bild auswählen",
"company_website_url" => "Webseite ist nicht in korrektem Format (http://...).",
"country_codes" => "Ländercodes",
"country_codes_tooltip" => "Kommagetrennte Liste der Ländercodes für den Adressvergleich.",
"currency_code" => "Währungscode",
"currency_decimals" => "Währungsdezimalzahlen",
"currency_symbol" => "Währungssymbol",
"current_employee_only" => "",
"customer_reward" => "Prämie",
"customer_reward_duplicate" => "Die Prämie muss eindeutig sein.",
"customer_reward_enable" => "Kundenprämien aktivieren",
"customer_reward_invalid_chars" => "Eine Prämie darf kein '_' enthalten",
"customer_reward_required" => "Prämie ist erforderlich",
"customer_sales_tax_support" => "",
"date_or_time_format" => "Datum und Uhrzeit Filter",
"datetimeformat" => "Datum und Zeit Format",
"decimal_point" => "Dezimaltrennzeichen",
"default_barcode_font_size_number" => "Standard Barcode Schriftgröße muss eine Zahl sein.",
"default_barcode_font_size_required" => "Standard Barcode Schriftgröße ist erforderlich.",
"default_barcode_height_number" => "Standard Barcode Höhe muss eine Zahl sein.",
"default_barcode_height_required" => "Standard Barcode Höhe ist erforderlich.",
"default_barcode_num_in_row_number" => "Standard Barcode Nummer muss eine Zahl sein.",
"default_barcode_num_in_row_required" => "Die Barcode Nummer ist erforderlich.",
"default_barcode_page_cellspacing_number" => "Standard Barcode Zellabstand muss eine Zahl sein.",
"default_barcode_page_cellspacing_required" => "Der Barcode Zellabstand ist erforderlich.",
"default_barcode_page_width_number" => "Standard Barcode Seitenbreite muss eine Zahl sein.",
"default_barcode_page_width_required" => "Die Barcode Seitenbreite ist erforderlich.",
"default_barcode_width_number" => "Standard Barcode Breite muss eine Zahl sein.",
"default_barcode_width_required" => "Standard Barcode Breite ist erforderlich.",
"default_item_columns" => "Standardmäßig sichtbare Spalten für Artikel",
"default_origin_tax_code" => "Standard Steuer Kürzel",
"default_receivings_discount" => "Standard Rabatt für Eingänge",
"default_receivings_discount_number" => "Standard Rabatt für Eingänge muss eine Zahl sein.",
"default_receivings_discount_required" => "Standard Rabatt für Eingänge ist erforderlich.",
"default_sales_discount" => "Standard Verkaufsrabatt",
"default_sales_discount_number" => "Der Standard Verkaufsrabatt muss eine Zahl sein.",
"default_sales_discount_required" => "Der Standard Verkaufsrabatt ist erforderlich.",
"default_tax_category" => "Standard-Steuerkategorie",
"default_tax_code" => "Standard Steuercode",
"default_tax_jurisdiction" => "Standard Steuerbehörde",
"default_tax_name_number" => "Standard Steuer Name muss ein String sein.",
"default_tax_name_required" => "Standardsteuerfeld ist erforderlich.",
"default_tax_rate" => "MWSt %",
"default_tax_rate_1" => "MWSt 1",
"default_tax_rate_2" => "MWSt 2",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "Standard Steuersatz muss eine Zahl sein.",
"default_tax_rate_required" => "Standard Steuersatz ist erforderlich.",
"derive_sale_quantity" => "Aus Gesamtbetrag abgeleitete Verkaufsmengen",
"derive_sale_quantity_tooltip" => "Falls ausgewählt wird ein neuer Artikeltyp für nach Gesamtbetrag bestellte Artikel bereitgestellt",
"dinner_table" => "Tisch",
"dinner_table_duplicate" => "Tisch muss eindeutig sein.",
"dinner_table_enable" => "Esstische aktivieren",
"dinner_table_invalid_chars" => "Tischname darf kein '_' enthalten.",
"dinner_table_required" => "Tisch wird benötigt.",
"dot" => "Punkt",
"email" => "eMail",
"email_configuration" => "Email Konfiguration",
"email_mailpath" => "Pfad zu Sendmail",
"email_protocol" => "Protokoll",
"email_receipt_check_behaviour" => "Kontrollkästchen E-Mail-Empfangsbestätigung",
"email_receipt_check_behaviour_always" => "Immer ausgewählt",
"email_receipt_check_behaviour_last" => "Letzte Auswahl speichern",
"email_receipt_check_behaviour_never" => "Nie ausgewählt",
"email_smtp_crypto" => "SMTP Verschlüsselung",
"email_smtp_host" => "SMTP-Server",
"email_smtp_pass" => "SMTP Passwort",
"email_smtp_port" => "SMTP-Port",
"email_smtp_timeout" => "SMTP-Timeout",
"email_smtp_user" => "SMTP Benutzername",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Datenschutz durchsetzen",
"enforce_privacy_tooltip" => "Schützen Sie die Privatsphäre Ihrer Kunden und erzwingen Sie die Verschlüsselung von Daten im Falle der Löschung ihrer Daten",
"fax" => "Fax",
"file_perm" => "There are problems with file permissions please fix and reload this page.",
"financial_year" => "Beginn Geschäftsjahr",
"financial_year_apr" => "1. April",
"financial_year_aug" => "1. August",
"financial_year_dec" => "1. Dezember",
"financial_year_feb" => "1. Februar",
"financial_year_jan" => "1. Januar",
"financial_year_jul" => "1. Juli",
"financial_year_jun" => "1. Juni",
"financial_year_mar" => "1. März",
"financial_year_may" => "1. Mai",
"financial_year_nov" => "1. November",
"financial_year_oct" => "1. Oktober",
"financial_year_sep" => "1. September",
"floating_labels" => "",
"gcaptcha_enable" => "Login reCAPTCHA",
"gcaptcha_secret_key" => "reCAPTCHA: Geheimer Schlüssel",
"gcaptcha_secret_key_required" => "reCAPTCHA Secret Key wird benötigt",
"gcaptcha_site_key" => "reCAPTCHA: Seitenschlüssel",
"gcaptcha_site_key_required" => "reCAPTCHA Site Key wird benötigt",
"gcaptcha_tooltip" => "Login mit Google reCAPTCHA schützen, das Icon anklicken um ein Schlüsselpaar zu erhalten.",
"general" => "Allgemeines",
"general_configuration" => "Allgemeine Konfiguration",
"giftcard_number" => "Gutscheinnummer",
"giftcard_random" => "Zufällig Erzeugen",
"giftcard_series" => "Serie Erzeugen",
"image_allowed_file_types" => "",
"image_max_height_tooltip" => "",
"image_max_size_tooltip" => "",
"image_max_width_tooltip" => "",
"image_restrictions" => "",
"include_hsn" => "Unterstützung für HSN-Codes einbinden",
"info" => "Informationen",
"info_configuration" => "Generelle Einstellungen",
"input_groups" => "",
"integrations" => "Integrationen",
"integrations_configuration" => "Drittanbieter Integrationen",
"invoice" => "Rechnungs",
"invoice_configuration" => "Druckereinstellungen",
"invoice_default_comments" => "Rechnungskommentar",
"invoice_email_message" => "Rechnungsvorlage (Email)",
"invoice_enable" => "Rechnungsstellung einschalten",
"invoice_printer" => "Rechnungsdrucker",
"invoice_type" => "Rechnungsart",
"is_readable" => "",
"is_writable" => "is writable, but the permissions are higher than 750.",
"item_markup" => "",
"jsprintsetup_required" => "Warnung: Diese Funktion benötigt das Firefox jsPrintSetup addon. Trotzdem speichern?",
"language" => "Sprache",
"last_used_invoice_number" => "Zuletzt verwendete Rechnungsnummer",
"last_used_quote_number" => "Zuletzt verwendete Angebotsnummer",
"last_used_work_order_number" => "Zuletzt verwendete Arbeitsauftragsnummer",
"left" => "Links",
"license" => "Lizenz",
"license_configuration" => "Lizenzvereinbarung",
"line_sequence" => "Zeilenfolge",
"lines_per_page" => "Zeilen pro Seite",
"lines_per_page_number" => "Zeilen pro Seite muss eine Zahl sein.",
"lines_per_page_required" => "Zeilen pro Seite ist erforderlich.",
"locale" => "Länder",
"locale_configuration" => "Länderkonfiguration",
"locale_info" => "Info Länderkonfiguration",
"location" => "Lagerort",
"location_configuration" => "Lagerort",
"location_info" => "Lagerort-Information",
"login_form" => "",
"logout" => "Wollen Sie vor dem Beenden eine Sicherung erstellen? Klicke [OK] für Sicherung.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp API Schlüssel",
"mailchimp_configuration" => "Mailchimp Konfiguration",
"mailchimp_key_successfully" => "API Key ist gültig.",
"mailchimp_key_unsuccessfully" => "API Key ist ungültig.",
"mailchimp_lists" => "Mailchimp Liste(n)",
"mailchimp_tooltip" => "Icon anklicken um API Key zu erhalten.",
"message" => "Nachricht",
"message_configuration" => "Nachrichtenkonfiguration",
"msg_msg" => "Gespeicherte Nachricht",
"msg_msg_placeholder" => "Wenn Sie eine SMS Vorlage benutzen wollen, geben Sie diese hier ein, ansonsten lassen Sie dieses Feld frei.",
"msg_pwd" => "SMS-API Passwort",
"msg_pwd_required" => "SMS-API Passwort ist ein Pflichtfeld",
"msg_src" => "SMS-API Sender ID",
"msg_src_required" => "SMS-API Sender ID ist ein Pflichtfeld",
"msg_uid" => "SMS-API Benutzername",
"msg_uid_required" => "SMS-API Benutzername ist ein Pflichtfeld",
"multi_pack_enabled" => "Mehrere Pakete pro Artikel",
"no_risk" => "No security/vulnerability risks.",
"none" => "none",
"notify_alignment" => "Benachrichtigungs Popup Position",
"number_format" => "Zahlenformat",
"number_locale" => "Länderkonfiguration",
"number_locale_invalid" => "Die eingegebene Lokale ist falsch. Bitte sehen Sie sich den Link im Tooltip an um einen korrekten Wert zu finden.",
"number_locale_required" => "Locale-Nummer ist ein Pflichtfeld.",
"number_locale_tooltip" => "Finden Sie eine korrekte Lokale über diesen Link.",
"os_timezone" => "",
"ospos_info" => "OSPOS Installations Information",
"payment_options_order" => "Zahlungsarten Reihenfolge",
"perm_risk" => "Permissions higher than 750 leaves this software at risk.",
"phone" => "Telefon",
"phone_required" => "Telefon ist erforderlich.",
"print_bottom_margin" => "Unterer Rand",
"print_bottom_margin_number" => "Unterer Rand muss eine Zahl sein.",
"print_bottom_margin_required" => "Unterer Rand ist erforderlich.",
"print_delay_autoreturn" => "Automatisch zu 'Verkauf' zurückkehren nach",
"print_delay_autoreturn_number" => "Automatisch zu 'Verkauf' zurückkehren nach ist erforderlich.",
"print_delay_autoreturn_required" => "Automatisch zu 'Verkauf' zurückkehren nach muss eine Zahl sein.",
"print_footer" => "Drucke Browser Fusszeile",
"print_header" => "Drucke Browser Kopfzeile",
"print_left_margin" => "Rand links",
"print_left_margin_number" => "Rand links muss eine Zahl sein.",
"print_left_margin_required" => "Rand links ist erforderlich.",
"print_receipt_check_behaviour" => "Quittung drucken",
"print_receipt_check_behaviour_always" => "Immer ausgewählt",
"print_receipt_check_behaviour_last" => "Letzte Auswahl speichern",
"print_receipt_check_behaviour_never" => "Nie ausgewählt",
"print_right_margin" => "Rand rechts",
"print_right_margin_number" => "Rand rechts muss eine Zahl sein.",
"print_right_margin_required" => "Rand rechts ist erforderlich.",
"print_silently" => "Zeige Druckdialog",
"print_top_margin" => "Rand oben",
"print_top_margin_number" => "Rand oben muss eine Zahl sein.",
"print_top_margin_required" => "Rand oben ist erforderlich.",
"quantity_decimals" => "Mengendezimalstellen",
"quick_cash_enable" => "",
"quote_default_comments" => "Angebot Standard-Kommentare",
"receipt" => "Eingang",
"receipt_category" => "",
"receipt_configuration" => "Druckereinstellungen",
"receipt_default" => "Default",
"receipt_font_size" => "Schriftgröße",
"receipt_font_size_number" => "Schriftgröße muss eine Zahl sein.",
"receipt_font_size_required" => "Schriftgröße ist erforderlich.",
"receipt_info" => "Quittungsinformation",
"receipt_printer" => "Quittungsdrucker",
"receipt_short" => "Kurz",
"receipt_show_company_name" => "Firmenname anzeigen",
"receipt_show_description" => "Beschreibung anzeigen",
"receipt_show_serialnumber" => "Seriennummer anzeigen",
"receipt_show_tax_ind" => "",
"receipt_show_taxes" => "Zeige MWSt",
"receipt_show_total_discount" => "Zeige Gesamtrabatt",
"receipt_template" => "Quittungs Template",
"receiving_calculate_average_price" => "Berechne Durchschnittseinkaufspreis",
"recv_invoice_format" => "Format Eingangsrechnung",
"register_mode_default" => "Standard Kassenmodus",
"report_an_issue" => "",
"return_policy_required" => "Rücknahmebedingungen sind erforderlich.",
"reward" => "Prämie",
"reward_configuration" => "Prämien Konfiguration",
"right" => "Rechts",
"sales_invoice_format" => "Format Verkaufsrechnung",
"sales_quote_format" => "Angebotsformat",
"mailpath_invalid" => "Ungültiger Sendmail-Pfad. Nur Buchstaben, Zahlen, Bindestriche, Unterstriche, Schrägstriche und Punkte sind erlaubt.",
"saved_successfully" => "Einstellungen erfolgreich gesichert.",
"saved_unsuccessfully" => "Einstellungen konnten nicht gesichert werden.",
"security_issue" => "Security Vulnerability Warning",
"server_notice" => "Bitte nutzen Sie die unten genannten Informationen für Problemberichterstattung.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Verwaltungssymbol anzeigen",
"statistics" => "Statistiken Senden",
"statistics_tooltip" => "Statistiken Senden für programierung und verbesserungen.",
"stock_location" => "Lagerort",
"stock_location_duplicate" => "Bitte verwenden Sie einen eindeutigen Lagerort.",
"stock_location_invalid_chars" => "Der Lagerort kann keine Unterstriche enthalten.",
"stock_location_required" => "Lagerort Nummer ist erforderlich.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Spalte 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Vorschläge Layout",
"suggestions_second_column" => "Spalte 2",
"suggestions_third_column" => "Spalte 3",
"system_conf" => "Setup & Conf",
"system_info" => "System Info",
"table" => "Tabelle",
"table_configuration" => "Tabelle konfigurieren",
"takings_printer" => "Einnahmendrucker",
"tax" => "Steuer",
"tax_category" => "Steuerkategorie",
"tax_category_duplicate" => "Die eingegebene Steuerkategorie existiert bereits.",
"tax_category_invalid_chars" => "Die eingegebene Steuerkategorie ist ungültig.",
"tax_category_required" => "Die Steuerkategorie ist erforderlich.",
"tax_category_used" => "Die Steuerkategorie kann nicht gelöscht werden, da sie in Benutzung ist.",
"tax_configuration" => "Steuer-Konfiguration",
"tax_decimals" => "Steuer Dezimalstellen",
"tax_id" => "Steuer ID",
"tax_included" => "MWSt inbegriffen",
"theme" => "Design",
"theme_preview" => "",
"thousands_separator" => "Tausendertrennzeichen",
"timezone" => "Zeitzone",
"timezone_error" => "",
"top" => "Oben",
"use_destination_based_tax" => "Zielabhängige Steuer verwenden",
"user_timezone" => "",
"website" => "Website",
"wholesale_markup" => "",
"work_order_enable" => "Unterstützung von Arbeitsaufträgen",
"work_order_format" => "Arbeitsauftragsformat",
];