Files
opensourcepos/app/Language/it/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
26 KiB
PHP

<?php
return [
"address" => "Indirizzo Azienda",
"address_required" => "Il campo Indirizzo Azienda è obbligatorio.",
"all_set" => "All file permissions are set correctly!",
"allow_duplicate_barcodes" => "Permetti Codice a Barre duplicati",
"apostrophe" => "apostrofo",
"backup_button" => "Backup",
"backup_database" => "Backup del Database",
"barcode" => "Codici a Barre",
"barcode_company" => "Nome Azienda",
"barcode_configuration" => "Configurazione Codici a Barre",
"barcode_content" => "Contenuto Codice a Barre",
"barcode_first_row" => "Riga 1",
"barcode_font" => "Font",
"barcode_formats" => "Formati d'input",
"barcode_generate_if_empty" => "Genera se vuoto.",
"barcode_height" => "Altezza (px)",
"barcode_id" => "Id/Nome Elemento",
"barcode_info" => "Informazioni Configurazione Codice a Barre",
"barcode_layout" => "Layout Codice a Barre",
"barcode_name" => "Nome",
"barcode_number" => "Codice a Barre",
"barcode_number_in_row" => "Numero nella riga",
"barcode_page_cellspacing" => "Mostra spaziatura celle.",
"barcode_page_width" => "Mostra larghezza pagina",
"barcode_price" => "Prezzo",
"barcode_second_row" => "Riga 2",
"barcode_third_row" => "Riga 3",
"barcode_tooltip" => "Attenzione: Questa funzionalità può causare la duplicazione dei prodotti da essere importati o creati. Non usarla se non vuoi codici a barre duplicati.",
"barcode_type" => "Tipo Codice a Barre",
"barcode_width" => "Larghezza (px)",
"bottom" => "Parte inferiore",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "Decimali Contanti",
"cash_decimals_tooltip" => "Se Decimali Contanti e Decimali Valuta sono le stesse non verrà effettuato un arrotondamento.",
"cash_rounding" => "Arrotondamento Contanti",
"category_dropdown" => "Mostra categoria come menu a discesa",
"center" => "Centro",
"change_apperance_tooltip" => "",
"comma" => "virgola",
"company" => "Nome Azienda",
"company_avatar" => "",
"company_change_image" => "Cambia Immagine",
"company_logo" => "Logo Azienda",
"company_remove_image" => "Rimuovi Immagine",
"company_required" => "Il campo Nome Compagnia è obbligatorio",
"company_select_image" => "Seleziona Immagine",
"company_website_url" => "Il sito dell'azienda non è un URL valido (http://...).",
"country_codes" => "Codice Postale",
"country_codes_tooltip" => "La lista di Codici Postali separate da virgole sono usate per la ricerca per indirizzo.",
"currency_code" => "Codice valuta",
"currency_decimals" => "Decimali Valuta",
"currency_symbol" => "Simbolo Valuta",
"current_employee_only" => "",
"customer_reward" => "Raccolta Punti",
"customer_reward_duplicate" => "Punti Fedeltà deve essere unica.",
"customer_reward_enable" => "Abilita la Raccolta Punti per i Clienti",
"customer_reward_invalid_chars" => "I punti fedeltà non possono contenere '_'",
"customer_reward_required" => "I Punti Fedeltà sono un campo obbligatorio",
"customer_sales_tax_support" => "Supporto Fiscale di vendita ai Clienti (Sales Tax Support)",
"date_or_time_format" => "Filtro Data e Ora",
"datetimeformat" => "Formato Data e Ora",
"decimal_point" => "Punti Decimali",
"default_barcode_font_size_number" => "La grandezza del Font del Codice a Barre di default deve essere un numero.",
"default_barcode_font_size_required" => "Il campo Grandezza del font del Codice a Barre di Default è obbligatorio.",
"default_barcode_height_number" => "Altezza di Default del Codice a Barre deve essere un numero.",
"default_barcode_height_required" => "Il campo Altezza Codice a Barre di Default è obbligatorio.",
"default_barcode_num_in_row_number" => "Il numero di Codice a Barre di Default nella Riga deve essere un numero.",
"default_barcode_num_in_row_required" => "Numero Codice a Barre di Default nella Riga è un campo obbligatorio.",
"default_barcode_page_cellspacing_number" => "Spaziatura Codice a Barre di Default deve essere un numero.",
"default_barcode_page_cellspacing_required" => "Spaziatura Codice a Barre di Default è un campo obbligatorio.",
"default_barcode_page_width_number" => "Larghezza Codice a Barre di Default deve essere un numero.",
"default_barcode_page_width_required" => "Larghezza Codice a Barre di Default è un campo obbligatorio.",
"default_barcode_width_number" => "Larghezza Codice a Barre di Default deve essere un numero.",
"default_barcode_width_required" => "Larghezza Codice a Barre di Default è un campo obbligatorio.",
"default_item_columns" => "Colonne degli elementi visibili di default",
"default_origin_tax_code" => "Codice Imposta di Origine Default",
"default_receivings_discount" => "Sconto sugli incassi predefiniti",
"default_receivings_discount_number" => "Lo sconto sugli incassi predefinito deve essere un numero.",
"default_receivings_discount_required" => "Lo sconto di ricezione predefinito è un campo obbligatorio.",
"default_sales_discount" => "Sconto Vendita Default %",
"default_sales_discount_number" => "Sconto Vendita Default deve essere un numero.",
"default_sales_discount_required" => "Sconto Vendita Default è un campo obbligatorio.",
"default_tax_category" => "Categoria di imposta predefinita",
"default_tax_code" => "Codice Fiscale predefinito",
"default_tax_jurisdiction" => "Giurisdizione fiscale predefinita",
"default_tax_name_number" => "Nome Tassazione Default deve essere una stringa.",
"default_tax_name_required" => "Nome Tassazione Default è un campo richiesto.",
"default_tax_rate" => "Percent. Imposta Default %",
"default_tax_rate_1" => "Perc. Imposta 1",
"default_tax_rate_2" => "Perc. Imposta 2",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "Percent. Imposta Default deve essere un numero.",
"default_tax_rate_required" => "Percent. Imposta Default è un campo obbligatorio.",
"derive_sale_quantity" => "Permetti Quantità Derivata dalle Vendite",
"derive_sale_quantity_tooltip" => "Se abilitato, un nuovo tipo di elemento sarà dato per quegli elementi che supereranno la quantità",
"dinner_table" => "Tavolo",
"dinner_table_duplicate" => "Il Tavolo deve essere univoco.",
"dinner_table_enable" => "Abilita Tavoli da Cena",
"dinner_table_invalid_chars" => "Nome Tavolo non può contenere '_'.",
"dinner_table_required" => "Tavolo è un campo obbligatorio.",
"dot" => "punto",
"email" => "Email",
"email_configuration" => "Configurazione Email",
"email_mailpath" => "Percorso per Sendmail",
"email_protocol" => "Protocol",
"email_receipt_check_behaviour" => "Checkbox email ricevuta",
"email_receipt_check_behaviour_always" => "Sempre selezionato",
"email_receipt_check_behaviour_last" => "Ricorda l'ultima selezione",
"email_receipt_check_behaviour_never" => "Sempre non selezionato",
"email_smtp_crypto" => "SMTP Encryption",
"email_smtp_host" => "SMTP Server",
"email_smtp_pass" => "SMTP Password",
"email_smtp_port" => "SMTP Porta",
"email_smtp_timeout" => "SMTP Timeout (s)",
"email_smtp_user" => "SMTP Username",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Rispetta privacy",
"enforce_privacy_tooltip" => "Rispetta la privacy dei tuoi clienti annullando i loro dati se cancellati",
"fax" => "Fax",
"file_perm" => "There are problems with file permissions please fix and reload this page.",
"financial_year" => "Data Inizio Anno Fiscale",
"financial_year_apr" => "1mo di Aprile",
"financial_year_aug" => "1mo di Agosto",
"financial_year_dec" => "1mo di Dicembre",
"financial_year_feb" => "1mo di Febbraio",
"financial_year_jan" => "1mo di Gennaio",
"financial_year_jul" => "1mo di Luglio",
"financial_year_jun" => "1mo di Giugno",
"financial_year_mar" => "1mo di Marzo",
"financial_year_may" => "1mo di Maggio",
"financial_year_nov" => "1mo di Novembre",
"financial_year_oct" => "1mo di Ottobre",
"financial_year_sep" => "1mo di Settembre",
"floating_labels" => "Etichette mobili",
"gcaptcha_enable" => "Login Page reCAPTCHA",
"gcaptcha_secret_key" => "reCAPTCHA Secret Key",
"gcaptcha_secret_key_required" => "reCAPTCHA Secret Key è un campo obbligatorio",
"gcaptcha_site_key" => "reCAPTCHA Site Key",
"gcaptcha_site_key_required" => "reCAPTCHA Site Key è un campo obbligatorio",
"gcaptcha_tooltip" => "Per proteggere la Login page con Google reCAPTCHA, clicca sull'icona per una key pair per l'API.",
"general" => "Generali",
"general_configuration" => "Configurazione Generale",
"giftcard_number" => "Numero Carta Regalo",
"giftcard_random" => "Genera Casualmente",
"giftcard_series" => "Genera in Serie",
"image_allowed_file_types" => "Tipi di file consentiti",
"image_max_height_tooltip" => "Altezza massima consentita per i caricamenti di immagini in pixel (px).",
"image_max_size_tooltip" => "Dimensione file massima consentita per il caricamento di immagini in kilobyte (kb).",
"image_max_width_tooltip" => "Larghezza massima consentita per i caricamenti di immagini in pixel (px).",
"image_restrictions" => "Restrizioni al caricamento delle immagini",
"include_hsn" => "Includere il supporto per i codici HSN",
"info" => "Informazioni",
"info_configuration" => "Informazioni Negozio",
"input_groups" => "Gruppi di Ingresso",
"integrations" => "Integrazioni",
"integrations_configuration" => "Integrazioni di terze parti",
"invoice" => "Fattura",
"invoice_configuration" => "Impostazioni di Stampa Fattura",
"invoice_default_comments" => "Commenti Fattura di Default",
"invoice_email_message" => "Template Email di Fattura",
"invoice_enable" => "Abilita Fatturazione",
"invoice_printer" => "Stampante per Fattura",
"invoice_type" => "Tipo fattura",
"is_readable" => "è leggibile, ma le autorizzazioni sono impostate in modo errato. Impostalo su 640 o 660 e aggiorna.",
"is_writable" => "è scrivibile, ma i permessi sono impostati in modo errato. Si prega di impostarlo su 750 e aggiornare.",
"item_markup" => "",
"jsprintsetup_required" => "Attenzione: Questa funzionalità funzionerà solo se è installato l'addon di FifeFox jsPrintSetup. Salvare ugualmente ?",
"language" => "Lingua",
"last_used_invoice_number" => "Ultimo Numero Fattura usato",
"last_used_quote_number" => "Ultimo Numero Preventivo usato",
"last_used_work_order_number" => "Ultimo Numero Ordine di Lavoro/Commessa usato",
"left" => "Sinistra",
"license" => "Licenza",
"license_configuration" => "Contenuti della Licenza",
"line_sequence" => "Sequenza Linea",
"lines_per_page" => "Linee per Pagina",
"lines_per_page_number" => "Le linee per Pagina devono essere un numero.",
"lines_per_page_required" => "Linee per Pagina è un campo obbligatorio.",
"locale" => "Localizzazione",
"locale_configuration" => "Configurazione Localizzazione",
"locale_info" => "Informazioni di Configurazione Localizzazione",
"location" => "Magazzino",
"location_configuration" => "Locazione Magazzino",
"location_info" => "Informazioni di Configurazione Posizione",
"login_form" => "Stile modulo di accesso",
"logout" => "Vuoi fare il backup prima di effettuare il logout? Premere [OK] per eseguirlo o [Cancella] per il logout.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp API Key",
"mailchimp_configuration" => "Configurazione Mailchimp",
"mailchimp_key_successfully" => "API Key valida.",
"mailchimp_key_unsuccessfully" => "API Key non valida.",
"mailchimp_lists" => "Lista/e Mailchimp",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "SMS",
"message_configuration" => "Configurazione SMS",
"msg_msg" => "Testo Messaggio Salvato",
"msg_msg_placeholder" => "Se vuoi utilizzare un template SMS, salva il tuo messaggio qui o lascia il campo in bianco.",
"msg_pwd" => "SMS-API Password",
"msg_pwd_required" => "SMS-API Password è un campo obbligatorio",
"msg_src" => "SMS-API Sender ID",
"msg_src_required" => "SMS-API Sender ID è un campo obbligatorio",
"msg_uid" => "SMS-API Username",
"msg_uid_required" => "SMS-API Username è un campo obbligatorio",
"multi_pack_enabled" => "Pacchetti multipli per articolo",
"no_risk" => "No security/vulnerability risks.",
"none" => "nessuno",
"notify_alignment" => "Posizione Popup di Notifica",
"number_format" => "Formato Numero",
"number_locale" => "Localizzazione",
"number_locale_invalid" => "La località inserita non è valida. Controlla il link nel tooltip per cercare una località valida.",
"number_locale_required" => "Numero Località è un campo obbligatorio.",
"number_locale_tooltip" => "Cerca una Località adatta con questo link.",
"os_timezone" => "OSPOS fuso orario:",
"ospos_info" => "Informazioni sull'installazione di OSPOS",
"payment_options_order" => "Opzioni di Pagamento Ordine",
"perm_risk" => "Le autorizzazioni errate lasciano questo software a rischio.",
"phone" => "Telefono Azienda",
"phone_required" => "Telefono Aziena è un campo obbligatorio.",
"print_bottom_margin" => "Margine Inferiore",
"print_bottom_margin_number" => "Margine Inferiore deve essere un numero.",
"print_bottom_margin_required" => "Margine Inferiore è un campo richiesto.",
"print_delay_autoreturn" => "Ritardo ritorno a Vendite",
"print_delay_autoreturn_number" => "Ritardo è un campo obbligatorio.",
"print_delay_autoreturn_required" => "Ritardo deve essere un numero.",
"print_footer" => "Stampa Footer del Browser",
"print_header" => "Stampa Intestazione del Browser",
"print_left_margin" => "Margine sinistro",
"print_left_margin_number" => "Margine sinistro deve essere un numero.",
"print_left_margin_required" => "Margine Sinistro è un campo obbligatorio.",
"print_receipt_check_behaviour" => "Checkbox stampa scontrino",
"print_receipt_check_behaviour_always" => "Sempre selezionato",
"print_receipt_check_behaviour_last" => "Ricorda l'ultima selezione",
"print_receipt_check_behaviour_never" => "Sempre non selezionato",
"print_right_margin" => "Margine Destro",
"print_right_margin_number" => "Margine Destro deve essere un numero.",
"print_right_margin_required" => "Margine Destro è un campo obbligatorio.",
"print_silently" => "Mostra Finestra di Stampa",
"print_top_margin" => "Margine Superiore",
"print_top_margin_number" => "Margine Superiore deve essere un numero.",
"print_top_margin_required" => "Margine Superiore è un campo obbligatorio.",
"quantity_decimals" => "Decimali Quantità",
"quick_cash_enable" => "",
"quote_default_comments" => "Commento di default Stime",
"receipt" => "Scontrino",
"receipt_category" => "",
"receipt_configuration" => "Impostazioni di stampa Scontrino",
"receipt_default" => "Default",
"receipt_font_size" => "Grandezza Font",
"receipt_font_size_number" => "Grandezza Font deve essere un numero.",
"receipt_font_size_required" => "Grandezza Font è un campo obbligatorio.",
"receipt_info" => "Informazioni di Configurazione Scontrino",
"receipt_printer" => "Stampante Ticket",
"receipt_short" => "Corto",
"receipt_show_company_name" => "Mostra Nome Compagnia",
"receipt_show_description" => "Mostra Descrizione",
"receipt_show_serialnumber" => "Mostra Numero Seriale",
"receipt_show_tax_ind" => "Mostra indicatore fiscale",
"receipt_show_taxes" => "Mostra Imposte",
"receipt_show_total_discount" => "Mostra Sconto Totale",
"receipt_template" => "Template Scontrino",
"receiving_calculate_average_price" => "Calcola Prezzo medio (Ricezione)",
"recv_invoice_format" => "Formato Fattura Acquisto",
"register_mode_default" => "Modalità Registro Automatico/Default",
"report_an_issue" => "Segnala un problema",
"return_policy_required" => "Politica di Reso è un campo obbligatorio.",
"reward" => "Raccolta Punti",
"reward_configuration" => "Configurazione Raccolta Punti",
"right" => "Destra",
"sales_invoice_format" => "Formato Fattura di Vendita",
"sales_quote_format" => "Formato Preventivo",
"mailpath_invalid" => "Percorso sendmail non valido. Sono ammessi solo lettere, numeri, trattini, trattini bassi, barre e punti.",
"saved_successfully" => "Configurazione salvata correttamente.",
"saved_unsuccessfully" => "Salvataggio Configurazione Fallito.",
"security_issue" => "Security Vulnerability Warning",
"server_notice" => "Please use the below info for issue reporting.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Mostra icona ufficio",
"statistics" => "Invia Statistiche",
"statistics_tooltip" => "Invia statistiche per lo sviluppo e il miglioramento delle funzionalità proposte.",
"stock_location" => "Posizione Magazzino",
"stock_location_duplicate" => "Posizione Magazzino deve essere unico.",
"stock_location_invalid_chars" => "Posizione Magazzino non può contenere '_'.",
"stock_location_required" => "Posizione Magazzino è un campo obbligatorio.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Colonna 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Schema di Suggerimenti di ricerca",
"suggestions_second_column" => "Colonna 2",
"suggestions_third_column" => "Colonna 3",
"system_conf" => "Setup & Conf",
"system_info" => "System Info",
"table" => "Tavoli (Ristorazione)",
"table_configuration" => "Configurazione Tavoli",
"takings_printer" => "Stampa scontrino",
"tax" => "Imposte",
"tax_category" => "Categoria Imposta",
"tax_category_duplicate" => "Categoria tassa esistente.",
"tax_category_invalid_chars" => "Categoria tassa non valida.",
"tax_category_required" => "Categoria tassa richiesta.",
"tax_category_used" => "Categoria Imposta non può essere eliminata perchè è in utilizzo.",
"tax_configuration" => "Configurazione Imposte",
"tax_decimals" => "Decimali Imposta",
"tax_id" => "Codice Fiscale",
"tax_included" => "Imposte incluse",
"theme" => "Tema",
"theme_preview" => "Anteprima tema:",
"thousands_separator" => "Separatore centinaia",
"timezone" => "Timezone",
"timezone_error" => "Il fuso orario OSPOS è diverso dal fuso orario locale.",
"top" => "Sopra",
"use_destination_based_tax" => "Usa l'imposta basata sulla destinazione",
"user_timezone" => "Fuso orario locale:",
"website" => "Sitoweb",
"wholesale_markup" => "",
"work_order_enable" => "Supporto all'ordine (Work Order Support)",
"work_order_format" => "Formato ordine di lavoro/commessa",
];