Files
opensourcepos/app/Language/da/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
24 KiB
PHP

<?php
return [
"address" => "Firma adresse",
"address_required" => "Firma adresse er et obligatorisk felt.",
"all_set" => "All file permissions are set correctly!",
"allow_duplicate_barcodes" => "Tillad duplikatstregkoder",
"apostrophe" => "apostrof",
"backup_button" => "Backup",
"backup_database" => "Backup Database",
"barcode" => "Stregkode",
"barcode_company" => "Firmanavn",
"barcode_configuration" => "Stregkode konfiguration",
"barcode_content" => "Stregkode indhold",
"barcode_first_row" => "Række 1",
"barcode_font" => "Skrifttype",
"barcode_formats" => "Inputformater",
"barcode_generate_if_empty" => "Generer hvis tom.",
"barcode_height" => "Højde (px)",
"barcode_id" => "Genstands Id/navn",
"barcode_info" => "Information om stregkode konfiguration",
"barcode_layout" => "Stregkode layout",
"barcode_name" => "Navn",
"barcode_number" => "Stregkode",
"barcode_number_in_row" => "Nummer i rækken",
"barcode_page_cellspacing" => "Vis sidens celleafstand.",
"barcode_page_width" => "Vis sidens bredde",
"barcode_price" => "Pris",
"barcode_second_row" => "Række 2",
"barcode_third_row" => "Række 3",
"barcode_tooltip" => "Advarsel: Denne funktion kan forårsage, at duplikerede genstande vil blive importeret eller oprettet. Anvend ikke hvis du ikke vil have duplikerede stregkoder.",
"barcode_type" => "Stregkode type",
"barcode_width" => "Bredde (px)",
"bottom" => "Bund",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "Kontante decimaler",
"cash_decimals_tooltip" => "Hvis kontante decimaler og valuta decimaler er de samme, kan kontanterne ikke rundes op.",
"cash_rounding" => "Kontant afrunding",
"category_dropdown" => "",
"center" => "Centrum",
"change_apperance_tooltip" => "",
"comma" => "Komma",
"company" => "Firma navn",
"company_avatar" => "",
"company_change_image" => "Skift billede",
"company_logo" => "Firma logo",
"company_remove_image" => "Fjern billede",
"company_required" => "Firma navn er et obligatorisk",
"company_select_image" => "Vælg billede",
"company_website_url" => "Firma hjemmeside er ikke en gyldig URL (http://...).",
"country_codes" => "Landekoder",
"country_codes_tooltip" => "Kommasepareret liste af landekoder til nominatim adresse søgning.",
"currency_code" => "Valuta kode",
"currency_decimals" => "Valuta decimaler",
"currency_symbol" => "Valuta symbol",
"current_employee_only" => "",
"customer_reward" => "Belønning",
"customer_reward_duplicate" => "Belønning skal være unik.",
"customer_reward_enable" => "Aktiver kunde belønninger",
"customer_reward_invalid_chars" => "Belønning må ikke indholde '_'",
"customer_reward_required" => "Belønning er et obligatorisk felt",
"customer_sales_tax_support" => "",
"date_or_time_format" => "Dato- og tidfilter",
"datetimeformat" => "Dato og tid format",
"decimal_point" => "Decimaltegn",
"default_barcode_font_size_number" => "Standard stregkode skriftstørrelse skal være et tal",
"default_barcode_font_size_required" => "Standard stregkode skriftstørrelse er et obligatorisk felt",
"default_barcode_height_number" => "Standard stregkode højde skal være et tal",
"default_barcode_height_required" => "Standard stegkode højde er et obligatorisk felt",
"default_barcode_num_in_row_number" => "Standard stregkode tal i en række skal være et tal",
"default_barcode_num_in_row_required" => "Standard stregkode tal i en række er et obligatorisk felt",
"default_barcode_page_cellspacing_number" => "Standard stregkodeside-celleafstand skal være et tal",
"default_barcode_page_cellspacing_required" => "Standard stegkodeside-celleafstand er et obligatorisk felt",
"default_barcode_page_width_number" => "Standard stregkode side bredde skal være et tal",
"default_barcode_page_width_required" => "Standard stregkode side bredde er et obligatorisk felt",
"default_barcode_width_number" => "Standard stregkode bredde skal være et tal",
"default_barcode_width_required" => "Standard stregkode bredde er et obligatorisk felt",
"default_item_columns" => "Standard synlige genstands-kolonner",
"default_origin_tax_code" => "Standard oprindelse af afgiftskode",
"default_receivings_discount" => "Standard modtagelsesrabat",
"default_receivings_discount_number" => "Standard modtagelsesrabat skal være et tal",
"default_receivings_discount_required" => "Standard modtagelsesrabat er et obligatorisk felt",
"default_sales_discount" => "Standard salgsrabat",
"default_sales_discount_number" => "Standard salgsrabat skal være et tal",
"default_sales_discount_required" => "Standard salgsrabat er et obligatorisk felt",
"default_tax_category" => "Standard afgiftskategori",
"default_tax_code" => "Standard afgiftskode",
"default_tax_jurisdiction" => "Standard afgift jurisdiktion",
"default_tax_name_number" => "Standard afgiftsnavn skal være en streng",
"default_tax_name_required" => "Standard afgiftsnavn er et obligatorisk felt",
"default_tax_rate" => "Standard afgiftsrate %",
"default_tax_rate_1" => "Afgift 1 procent",
"default_tax_rate_2" => "Afgift 2 procent",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "Standard afgiftsrate skal være et tal",
"default_tax_rate_required" => "Standard afgiftsrate er et obligatorisk felt",
"derive_sale_quantity" => "Tillad afledt salgsmængde",
"derive_sale_quantity_tooltip" => "Hvis markeret, vil en ny varetype blive stillet til rådighed for varer bestilt med et udvidet beløb",
"dinner_table" => "Tabel",
"dinner_table_duplicate" => "Tabel skal være unik",
"dinner_table_enable" => "Enable Dinner Tables",
"dinner_table_invalid_chars" => "Table Name can not contain '_'.",
"dinner_table_required" => "Table is a required field.",
"dot" => "punktum",
"email" => "Email",
"email_configuration" => "Email konfiguration",
"email_mailpath" => "Stig til Sendmail",
"email_protocol" => "Protokol",
"email_receipt_check_behaviour" => "Email kvitteringsfelt",
"email_receipt_check_behaviour_always" => "Altid markeret",
"email_receipt_check_behaviour_last" => "Husk sidste valg",
"email_receipt_check_behaviour_never" => "Aldrig markeret",
"email_smtp_crypto" => "SMTP Kryptering",
"email_smtp_host" => "SMTP Server",
"email_smtp_pass" => "SMTP Kodeord",
"email_smtp_port" => "SMTP Port",
"email_smtp_timeout" => "SMTP Timeout (sekunder)",
"email_smtp_user" => "SMTP Brugernavn",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Håndhæv privathed",
"enforce_privacy_tooltip" => "Beskyt kunders privatliv, der håndhæver datascrambling i tilfælde af, at deres data bliver slettet",
"fax" => "Fax",
"file_perm" => "There are problems with file permissions please fix and reload this page.",
"financial_year" => "Fiscal Year Start",
"financial_year_apr" => "1st of April",
"financial_year_aug" => "1st of August",
"financial_year_dec" => "1st of December",
"financial_year_feb" => "1st of February",
"financial_year_jan" => "1st of January",
"financial_year_jul" => "1st of July",
"financial_year_jun" => "1st of June",
"financial_year_mar" => "1st of March",
"financial_year_may" => "1st of May",
"financial_year_nov" => "1st of November",
"financial_year_oct" => "1st of October",
"financial_year_sep" => "1st of September",
"floating_labels" => "",
"gcaptcha_enable" => "Login Page reCAPTCHA",
"gcaptcha_secret_key" => "reCAPTCHA Secret Key",
"gcaptcha_secret_key_required" => "reCAPTCHA Secret Key is a required field",
"gcaptcha_site_key" => "reCAPTCHA Site Key",
"gcaptcha_site_key_required" => "reCAPTCHA Site Key is a required field",
"gcaptcha_tooltip" => "Protect the Login page with Google reCAPTCHA, click the icon for an API key pair.",
"general" => "General",
"general_configuration" => "General Configuration",
"giftcard_number" => "Gift Card Number",
"giftcard_random" => "Generate Random",
"giftcard_series" => "Generate in Series",
"image_allowed_file_types" => "",
"image_max_height_tooltip" => "",
"image_max_size_tooltip" => "",
"image_max_width_tooltip" => "",
"image_restrictions" => "",
"include_hsn" => "Include Support for HSN Codes",
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "",
"integrations" => "Integrations",
"integrations_configuration" => "Third Party Integrations",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
"invoice_email_message" => "Invoice Email Template",
"invoice_enable" => "Enable Invoicing",
"invoice_printer" => "Invoice Printer",
"invoice_type" => "Invoice Type",
"is_readable" => "",
"is_writable" => "is writable, but the permissions are higher than 750.",
"item_markup" => "",
"jsprintsetup_required" => "Warning: This functionality will only work if you have the FireFox jsPrintSetup addon installed. Save anyway?",
"language" => "Language",
"last_used_invoice_number" => "Last used Invoice Number",
"last_used_quote_number" => "Last used Quote Number",
"last_used_work_order_number" => "Last used W/O Number",
"left" => "Left",
"license" => "License",
"license_configuration" => "License Statement",
"line_sequence" => "Line Sequence",
"lines_per_page" => "Lines per Page",
"lines_per_page_number" => "Lines per Page must be a number.",
"lines_per_page_required" => "Lines per Page is a required field.",
"locale" => "Localization",
"locale_configuration" => "Localization Configuration",
"locale_info" => "Localization Configuration Information",
"location" => "Stock",
"location_configuration" => "Stock Locations",
"location_info" => "Location Configuration Information",
"login_form" => "",
"logout" => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp API Key",
"mailchimp_configuration" => "Mailchimp Configuration",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "Mailchimp List(s)",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",
"msg_msg_placeholder" => "If you wish to use a SMS template save your message here, otherwise leave the box blank.",
"msg_pwd" => "SMS-API Password",
"msg_pwd_required" => "SMS-API Password is a required field",
"msg_src" => "SMS-API Sender ID",
"msg_src_required" => "SMS-API Sender ID is a required field",
"msg_uid" => "SMS-API Username",
"msg_uid_required" => "SMS-API Username is a required field",
"multi_pack_enabled" => "Multiple Packages per Item",
"no_risk" => "No security/vulnerability risks.",
"none" => "none",
"notify_alignment" => "Notification Popup Position",
"number_format" => "Number Format",
"number_locale" => "Localization",
"number_locale_invalid" => "The entered locale is invalid. Check the link in the tooltip to find a valid locale.",
"number_locale_required" => "Number Locale is a required field.",
"number_locale_tooltip" => "Find a suitable locale through this link.",
"os_timezone" => "",
"ospos_info" => "OSPOS Installation Info",
"payment_options_order" => "Payment Options Order",
"perm_risk" => "Permissions higher than 750 leaves this software at risk.",
"phone" => "Company Phone",
"phone_required" => "Company Phone is a required field.",
"print_bottom_margin" => "Margin Bottom",
"print_bottom_margin_number" => "Margin Bottom must be a number.",
"print_bottom_margin_required" => "Margin Bottom is a required field.",
"print_delay_autoreturn" => "Autoreturn to Sale delay",
"print_delay_autoreturn_number" => "Autoreturn to Sale delay is a required field.",
"print_delay_autoreturn_required" => "Autoreturn to Sale delay must be a number.",
"print_footer" => "Print Browser Footer",
"print_header" => "Print Browser Header",
"print_left_margin" => "Margin Left",
"print_left_margin_number" => "Margin Left must be a number.",
"print_left_margin_required" => "Margin Left is a required field.",
"print_receipt_check_behaviour" => "Print Receipt checkbox",
"print_receipt_check_behaviour_always" => "Always checked",
"print_receipt_check_behaviour_last" => "Remember last selection",
"print_receipt_check_behaviour_never" => "Always unchecked",
"print_right_margin" => "Margin Right",
"print_right_margin_number" => "Margin Right must be a number.",
"print_right_margin_required" => "Margin Right is a required field.",
"print_silently" => "Show Print Dialog",
"print_top_margin" => "Margin Top",
"print_top_margin_number" => "Margin Top must be a number.",
"print_top_margin_required" => "Margin Top is a required field.",
"quantity_decimals" => "Quantity Decimals",
"quick_cash_enable" => "",
"quote_default_comments" => "Default Quote Comments",
"receipt" => "Receipt",
"receipt_category" => "",
"receipt_configuration" => "Receipt Print Settings",
"receipt_default" => "Default",
"receipt_font_size" => "Font Size",
"receipt_font_size_number" => "Font Size must be a number.",
"receipt_font_size_required" => "Font Size is a required field.",
"receipt_info" => "Receipt Configuration Information",
"receipt_printer" => "Ticket Printer",
"receipt_short" => "Short",
"receipt_show_company_name" => "Show Company Name",
"receipt_show_description" => "Show Description",
"receipt_show_serialnumber" => "Show Serial Number",
"receipt_show_tax_ind" => "Show Tax Indicator",
"receipt_show_taxes" => "Show Taxes",
"receipt_show_total_discount" => "Show Total Discount",
"receipt_template" => "Receipt Template",
"receiving_calculate_average_price" => "Calc avg. Price (Receiving)",
"recv_invoice_format" => "Receivings Invoice Format",
"register_mode_default" => "Default Register Mode",
"report_an_issue" => "",
"return_policy_required" => "Return policy is a required field.",
"reward" => "Reward",
"reward_configuration" => "Reward Configuration",
"right" => "Right",
"sales_invoice_format" => "Sales Invoice Format",
"sales_quote_format" => "Sales Quote Format",
"mailpath_invalid" => "",
"saved_successfully" => "Configuration save successful.",
"saved_unsuccessfully" => "Configuration save failed.",
"security_issue" => "Security Vulnerability Warning",
"server_notice" => "Please use the below info for issue reporting.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Show office icon",
"statistics" => "Send Statistics",
"statistics_tooltip" => "Send statistics for development and feature improvement purposes.",
"stock_location" => "Stock location",
"stock_location_duplicate" => "Stock Location must be unique.",
"stock_location_invalid_chars" => "Stock Location can not contain '_'.",
"stock_location_required" => "Stock location is a required field.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Column 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Search Suggestions Layout",
"suggestions_second_column" => "Column 2",
"suggestions_third_column" => "Column 3",
"system_conf" => "Setup & Conf",
"system_info" => "System Info",
"table" => "Table",
"table_configuration" => "Table Configuration",
"takings_printer" => "Receipt Printer",
"tax" => "Tax",
"tax_category" => "Tax Category",
"tax_category_duplicate" => "The entered tax category already exists.",
"tax_category_invalid_chars" => "The entered tax category is invalid.",
"tax_category_required" => "The tax category is required.",
"tax_category_used" => "Tax category cannot be deleted because it is being used.",
"tax_configuration" => "Tax Configuration",
"tax_decimals" => "Tax Decimals",
"tax_id" => "Tax Id",
"tax_included" => "Tax Included",
"theme" => "Theme",
"theme_preview" => "",
"thousands_separator" => "Thousands Separator",
"timezone" => "Timezone",
"timezone_error" => "",
"top" => "Top",
"use_destination_based_tax" => "Use Destination Based Tax",
"user_timezone" => "",
"website" => "Website",
"wholesale_markup" => "",
"work_order_enable" => "Work Order Support",
"work_order_format" => "Work Order Format",
];