Files
opensourcepos/app/Language/es-MX/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" => "Dirección de la Empresa",
"address_required" => "La Dirección de la Empresa es un campo requerido.",
"all_set" => "Todos los permisos han sido establecidos correctamente!",
"allow_duplicate_barcodes" => "Permitir Códigos de Barra Duplicados",
"apostrophe" => "apostrofé",
"backup_button" => "Respaldar",
"backup_database" => "Respaldar Base de Datos",
"barcode" => "Código de Barras",
"barcode_company" => "Nombre de la Empresa",
"barcode_configuration" => "Configuración del Código de Barras",
"barcode_content" => "Contenido del Código de Barras",
"barcode_first_row" => "Fila 1",
"barcode_font" => "Tipo de Letra",
"barcode_formats" => "Formatos de Entrada",
"barcode_generate_if_empty" => "Generar si está vacío.",
"barcode_height" => "Alto (px)",
"barcode_id" => "Id Artículo/Nombre",
"barcode_info" => "Información de Configuración para Códigos de Barras",
"barcode_layout" => "Formato Código de Barras",
"barcode_name" => "Nombre",
"barcode_number" => "Código de Barras",
"barcode_number_in_row" => "Número en renglón",
"barcode_page_cellspacing" => "Mostrar espaciado de celda de la página.",
"barcode_page_width" => "Ancho de página",
"barcode_price" => "Precio",
"barcode_second_row" => "Renglón 2",
"barcode_third_row" => "Renglón 3",
"barcode_tooltip" => "Advertencia: Esta función puede hacer que se importen o creen elementos duplicados. No lo use si no desea códigos de barras duplicados.",
"barcode_type" => "Tipo de código de barras",
"barcode_width" => "Ancho (px)",
"bottom" => "Final",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "decimales en efectivo",
"cash_decimals_tooltip" => "Si los decimales son iguales entonces no tendrá redondeo.",
"cash_rounding" => "Redondeo de efectivo",
"category_dropdown" => "Mostrar categoría como un menú desplegable",
"center" => "Centro",
"change_apperance_tooltip" => "",
"comma" => "coma",
"company" => "Nombre de la Compañía",
"company_avatar" => "",
"company_change_image" => "Cambiar Imagen",
"company_logo" => "Logo de la Compañía",
"company_remove_image" => "Eliminar Imagen",
"company_required" => "Nombre de la compañia es un campo requerido",
"company_select_image" => "Seleccionar Imagen",
"company_website_url" => "Website de la compañía no es una URL valida (http://...).",
"country_codes" => "Códigos de Países",
"country_codes_tooltip" => "Lista separada por comas de códigos de países para la búsqueda de direcciones nominatim.",
"currency_code" => "código de moneda",
"currency_decimals" => "Decimales de moneda",
"currency_symbol" => "Símbolo de moneda",
"current_employee_only" => "",
"customer_reward" => "Recompensa",
"customer_reward_duplicate" => "Recompensa debe ser única.",
"customer_reward_enable" => "Habilita recompensas para los clientes",
"customer_reward_invalid_chars" => "Recompensa no debe tener '_'",
"customer_reward_required" => "Recompensa es un campo requerido",
"customer_sales_tax_support" => "",
"date_or_time_format" => "Filtro Fecha y Hora",
"datetimeformat" => "Formato de Fecha y Hora",
"decimal_point" => "Punto Decimal",
"default_barcode_font_size_number" => "El tamaño de fuente del código de barras predeterminado debe ser un número.",
"default_barcode_font_size_required" => "El tamaño de fuente predeterminado del código de barras es un campo obligatorio.",
"default_barcode_height_number" => "La altura predeterminada del código de barras debe ser un número.",
"default_barcode_height_required" => "La altura predeterminada del código de barras es un campo obligatorio.",
"default_barcode_num_in_row_number" => "El número de código de barras predeterminado en la fila debe ser un número.",
"default_barcode_num_in_row_required" => "El número de código de barras predeterminado en la fila es un campo obligatorio.",
"default_barcode_page_cellspacing_number" => "El espacio entre celdas predeterminado de la página de código de barras debe ser un número.",
"default_barcode_page_cellspacing_required" => "El espaciado entre celdas de página de código de barras predeterminado es un campo obligatorio.",
"default_barcode_page_width_number" => "La anchura del código de barras debe ser un número.",
"default_barcode_page_width_required" => "El ancho predeterminado del código de barras es un campo obligatorio.",
"default_barcode_width_number" => "El Ancho del código de barra debe ser un número.",
"default_barcode_width_required" => "El ancho predeterminado del código de barras es un campo obligatorio.",
"default_item_columns" => "Número de artículos por columna predeterminado",
"default_origin_tax_code" => "Código de Impuesto predeterminado",
"default_receivings_discount" => "Descuentos de recibos predeterminados",
"default_receivings_discount_number" => "Descuentos de recibos deben ser números.",
"default_receivings_discount_required" => "Descuentos de recibos es un campo requerido.",
"default_sales_discount" => "% Descuentos en ventas",
"default_sales_discount_number" => "El descuento predeterminado debe ser un número.",
"default_sales_discount_required" => "Descuento de Ventas por Defecto es un campo requerido.",
"default_tax_category" => "Categoría de Impuesto Predeterminada",
"default_tax_code" => "Código de Impuesto Predeterminado",
"default_tax_jurisdiction" => "Jurisdicción de Impuesto Predeterminada",
"default_tax_name_number" => "Nombre de Impuesto Predeterminado debe ser una cadena de texto.",
"default_tax_name_required" => "Nombre de Impuesto Predeterminado es un campo requerido.",
"default_tax_rate" => "Tasa impositiva predeterminada %",
"default_tax_rate_1" => "Tasa de Impuestos 1",
"default_tax_rate_2" => "Tasa de Impuestos 2",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "La tasa impositiva predeterminada debe ser un número.",
"default_tax_rate_required" => "Tasa de impuestos predeterminada es un campo obligatorio.",
"derive_sale_quantity" => "Permitir cantidad de venta derivada",
"derive_sale_quantity_tooltip" => "Si se marca, se proporcionará un nuevo tipo de artículo para los artículos pedidos por cantidad extendida",
"dinner_table" => "Mesa",
"dinner_table_duplicate" => "La tabla debe ser única.",
"dinner_table_enable" => "Habilitar Mesa de Alimentos",
"dinner_table_invalid_chars" => "El nombre de la tabla no puede llevar '_'.",
"dinner_table_required" => "Tabla es requerida.",
"dot" => "punto(.)",
"email" => "Email",
"email_configuration" => "Configuración Email",
"email_mailpath" => "Ruta a Sendmail",
"email_protocol" => "Protocolo",
"email_receipt_check_behaviour" => "Email Receipt checkbox",
"email_receipt_check_behaviour_always" => "Siempre selecionado",
"email_receipt_check_behaviour_last" => "Recuerda la última selección",
"email_receipt_check_behaviour_never" => "Núnca seleccionado",
"email_smtp_crypto" => "Encriptación SMTP",
"email_smtp_host" => "Servidor SMTP",
"email_smtp_pass" => "Contraseña del Servidor SMTP",
"email_smtp_port" => "Puerto del Servidor SMTP",
"email_smtp_timeout" => "Expiró Tiempo de Espera del Servidor SMTP",
"email_smtp_user" => "Nombre de Usuario del Servidor SMTP",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Enforce privacy",
"enforce_privacy_tooltip" => "Protect Customers privacy enforcing data scrambling in case of their data being deleted",
"fax" => "Fax",
"file_perm" => "Hay problemas con los permisos de archivo, por favor corríjalos y recargue esta página.",
"financial_year" => "Inicio del Año Fiscal",
"financial_year_apr" => "1.º de Abril",
"financial_year_aug" => "1.º de Agosto",
"financial_year_dec" => "1.º de Diciembre",
"financial_year_feb" => "1.º de Febrero",
"financial_year_jan" => "1.º de Enero",
"financial_year_jul" => "1.º de Julio",
"financial_year_jun" => "1.º de Junio",
"financial_year_mar" => "1.º de Marzo",
"financial_year_may" => "1.º de Mayo",
"financial_year_nov" => "1.º de Noviembre",
"financial_year_oct" => "1.º de Octubre",
"financial_year_sep" => "1º. de Septiembre",
"floating_labels" => "Etiquetas Flotantes",
"gcaptcha_enable" => "reCAPTCHA de Página de Ingreso",
"gcaptcha_secret_key" => "reCAPTCHA Secret Key",
"gcaptcha_secret_key_required" => "reCAPTCHA Llave Secreta es un campo requerido",
"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" => "Tipo de archivos permitidos",
"image_max_height_tooltip" => "Altura máxima permitida de imágenes en píxeles (px).",
"image_max_size_tooltip" => "Tamaño máximo permitido de archivo de imágenes en kilobytes (kb).",
"image_max_width_tooltip" => "Ancho máximo permitido para imágenes en píxeles (px).",
"image_restrictions" => "Restricciones de carga de imágenes",
"include_hsn" => "Include Support for HSN Codes",
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "Grupos de Entrada",
"integrations" => "Integraciones",
"integrations_configuration" => "Integraciones Externas",
"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" => "es legible, pero los permisos están configurados incorrectamente. Configúrelo en 640 o 660 y actualice.",
"is_writable" => "se puede escribir, pero los permisos están configurados incorrectamente. Configúrelo en 750 y actualice.",
"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" => "Estilo de formulario de inicio de sesión",
"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 Clave API",
"mailchimp_configuration" => "Configuración de MailChimp",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "Lista (s) de MailChimp",
"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" => "Zona horaria OSPOS:",
"ospos_info" => "Información de instalación OSPOS",
"payment_options_order" => "Payment Options Order",
"perm_risk" => "Los permisos incorrectos ponen en riesgo este software.",
"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" => "Mostrar indicador de impuestos",
"receipt_show_taxes" => "Show Taxes",
"receipt_show_total_discount" => "Show Total Discount",
"receipt_template" => "Receipt Template",
"receiving_calculate_average_price" => "Calcular promedio, Precio (Recepción)",
"recv_invoice_format" => "Receivings Invoice Format",
"register_mode_default" => "Default Register Mode",
"report_an_issue" => "Reportar un problema",
"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" => "Ruta de sendmail inválida. Solo se permiten letras, números, guiones, guiones bajos, barras y puntos.",
"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" => "Ubicación del inventario",
"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" => "Vista Previa del Tema:",
"thousands_separator" => "Thousands Separator",
"timezone" => "Timezone",
"timezone_error" => "La zona horaria de OSPOS es diferente a su zona horaria local.",
"top" => "Top",
"use_destination_based_tax" => "Use Destination Based Tax",
"user_timezone" => "Zona horaria local:",
"website" => "Website",
"wholesale_markup" => "",
"work_order_enable" => "Work Order Support",
"work_order_format" => "Work Order Format",
];