Files
opensourcepos/app/Language/pt-BR/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
27 KiB
PHP

<?php
return [
"address" => "Endereço da empresa",
"address_required" => "Endereço da empresa é um campo obrigatório.",
"all_set" => "All file permissions are set correctly!",
"allow_duplicate_barcodes" => "Permitir códigos de barras duplicados",
"apostrophe" => "apóstrofe",
"backup_button" => "Cópia de Segurança",
"backup_database" => "Cópia de Segurança",
"barcode" => "Código de Barras",
"barcode_company" => "Nome da Empresa",
"barcode_configuration" => "Configuração do Código de Barras",
"barcode_content" => "Conteúdo do código de barras",
"barcode_first_row" => "Linha 1",
"barcode_font" => "Fonte",
"barcode_formats" => "Formatos de entrada",
"barcode_generate_if_empty" => "Gerar se vazio.",
"barcode_height" => "Altura (px)",
"barcode_id" => "Item Id/Nome",
"barcode_info" => "Informação de configuração de códigos de barras",
"barcode_layout" => "Layout Código de barras",
"barcode_name" => "Nome",
"barcode_number" => "Código de Barras",
"barcode_number_in_row" => "Número de linhas",
"barcode_page_cellspacing" => "Espaçamento das células na página de exibição.",
"barcode_page_width" => "Largura da página de exibição",
"barcode_price" => "Preço",
"barcode_second_row" => "Linha 2",
"barcode_third_row" => "Linha 3",
"barcode_tooltip" => "Aviso: esse recurso pode fazer com que itens duplicados sejam importados ou criados. Não use se você não quiser códigos de barras duplicados.",
"barcode_type" => "Tipo de código de barras",
"barcode_width" => "Largura (px)",
"bottom" => "Inferior",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "Decimais da moeda",
"cash_decimals_tooltip" => "Se os decimais de caixa e os decimais de moeda forem os mesmos, não haverá arredondamento de caixa.",
"cash_rounding" => "Arredondamento de Caixa",
"category_dropdown" => "Mostrar Categoria como campo suspenso",
"center" => "Centro",
"change_apperance_tooltip" => "",
"comma" => "Vírgula",
"company" => "Nome da empresa",
"company_avatar" => "",
"company_change_image" => "Trocar imagem",
"company_logo" => "Logo da empresa",
"company_remove_image" => "Remover imagem",
"company_required" => "Nome da empresa é requerido",
"company_select_image" => "Selecionar imagem",
"company_website_url" => "Site da empresa não é uma URL válida (http://...).",
"country_codes" => "Código do país",
"country_codes_tooltip" => "Vírgula lista de códigos de país separado para pesquisa de endereços pelo nome.",
"currency_code" => "Código da moeda",
"currency_decimals" => "Decimais da moeda",
"currency_symbol" => "Simbolo moeda",
"current_employee_only" => "",
"customer_reward" => "Recompensa",
"customer_reward_duplicate" => "Recompensa deve ser única.",
"customer_reward_enable" => "Ativar recompensas do cliente",
"customer_reward_invalid_chars" => "Recompensa não pode conter '_'",
"customer_reward_required" => "Recompensa é um campo obrigatório",
"customer_sales_tax_support" => "Suporte ao imposto sobre vendas do cliente",
"date_or_time_format" => "Filtro de data e hora",
"datetimeformat" => "Formato da data e hora",
"decimal_point" => "Ponto decimal",
"default_barcode_font_size_number" => "O tamanho da fonte do código de barras padrão deve ser um número.",
"default_barcode_font_size_required" => "O tamanho da fonte do código de barras padrão é um campo obrigatório.",
"default_barcode_height_number" => "A altura do código de barras padrão deve ser um número.",
"default_barcode_height_required" => "A altura do código de barras padrão é um campo obrigatório.",
"default_barcode_num_in_row_number" => "O número de código de barras padrão na linha deve ser um número.",
"default_barcode_num_in_row_required" => "O número de código de barras padrão na linha é um campo obrigatório.",
"default_barcode_page_cellspacing_number" => "O espaçamento das células na página de código de barras padrão deve ser um número.",
"default_barcode_page_cellspacing_required" => "O espaçamento das células na página de código de barras padrão é um campo obrigatório.",
"default_barcode_page_width_number" => "A largura da página de código de barras padrão deve ser um número.",
"default_barcode_page_width_required" => "A largura da página de código de barras padrão é um campo obrigatório.",
"default_barcode_width_number" => "A largura do código de barras padrão deve ser um número.",
"default_barcode_width_required" => "A largura do código de barras padrão é um campo obrigatório.",
"default_item_columns" => "Colunas de itens visíveis padrão",
"default_origin_tax_code" => "Código de imposto de origem padrão",
"default_receivings_discount" => "Desconto de recebimento padrão",
"default_receivings_discount_number" => "Desconto de recebimento padrão deve ser um número.",
"default_receivings_discount_required" => "Desconto de recebimento padrão é um campo obrigatório.",
"default_sales_discount" => "Desconto de vendas padrão",
"default_sales_discount_number" => "O desconto de vendas padrão deve ser um número.",
"default_sales_discount_required" => "O desconto de vendas padrão é um campo obrigatório.",
"default_tax_category" => "Categoria de imposto padrão",
"default_tax_code" => "Código Tributário Padrão",
"default_tax_jurisdiction" => "Jurisdição fiscal padrão",
"default_tax_name_number" => "O nome do imposto padrão deve ser uma string.",
"default_tax_name_required" => "Nome da taxa padrão é requerida.",
"default_tax_rate" => "Imposto Tarifa Padrão %",
"default_tax_rate_1" => "Imposto 1 Tarifa",
"default_tax_rate_2" => "Imposto 2 Tarifa",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "A taxa de Imposto padrão deve ser um número.",
"default_tax_rate_required" => "A taxa de Imposto padrão é um campo obrigatório.",
"derive_sale_quantity" => "Permitir quantidade de venda derivada",
"derive_sale_quantity_tooltip" => "Se marcado, um novo tipo de item será fornecido para itens solicitados por quantidade estendida",
"dinner_table" => "Mesa",
"dinner_table_duplicate" => "A mesa deve ser única.",
"dinner_table_enable" => "Ativar mesas de jantar",
"dinner_table_invalid_chars" => "O nome da mesa não pode conter '_'.",
"dinner_table_required" => "A mesa é um campo obrigatório.",
"dot" => "ponto",
"email" => "E-mail",
"email_configuration" => "Configuração de Email",
"email_mailpath" => "Caminho para Sendmail",
"email_protocol" => "Protocolo",
"email_receipt_check_behaviour" => "Caixa de seleção de recibo de e-mail",
"email_receipt_check_behaviour_always" => "Sempre selecionado",
"email_receipt_check_behaviour_last" => "Lembrar da última seleção",
"email_receipt_check_behaviour_never" => "Sempre desativado",
"email_smtp_crypto" => "Criptografia SMTP",
"email_smtp_host" => "Servidor SMTP",
"email_smtp_pass" => "Senha SMTP",
"email_smtp_port" => "Porta SMTP",
"email_smtp_timeout" => "SMTP Tempo esgotado",
"email_smtp_user" => "Nome de usuário SMTP",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Reforce a privacidade",
"enforce_privacy_tooltip" => "Proteja a privacidade dos clientes, impondo a codificação de dados no caso de seus dados serem excluídos",
"fax" => "Fax",
"file_perm" => "There are problems with file permissions please fix and reload this page.",
"financial_year" => "Início do ano fiscal",
"financial_year_apr" => "1 de abril",
"financial_year_aug" => "1 de agosto",
"financial_year_dec" => "1 de dezembro",
"financial_year_feb" => "1 de fevereiro",
"financial_year_jan" => "1 de janeiro",
"financial_year_jul" => "1 de julho",
"financial_year_jun" => "1 de junho",
"financial_year_mar" => "1 de março",
"financial_year_may" => "1 de maio",
"financial_year_nov" => "1 de novembro",
"financial_year_oct" => "1 de outubro",
"financial_year_sep" => "1 de setembro",
"floating_labels" => "",
"gcaptcha_enable" => "Página de login reCAPTCHA",
"gcaptcha_secret_key" => "Chave secreta do reCAPTCHA",
"gcaptcha_secret_key_required" => "A chave secreta reCAPTCHA é um campo obrigatório",
"gcaptcha_site_key" => "Chave do site reCAPTCHA",
"gcaptcha_site_key_required" => "A chave do site reCAPTCHA é um campo obrigatório",
"gcaptcha_tooltip" => "Proteja a página de login com o Google reCAPTCHA e clique no ícone de um par de chaves de API.",
"general" => "Gerais",
"general_configuration" => "Configurações Gerais",
"giftcard_number" => "Número cartão presente",
"giftcard_random" => "Geração aleaória",
"giftcard_series" => "Gerado em serie",
"image_allowed_file_types" => "Tipos de arquivo permitidos",
"image_max_height_tooltip" => "Altura máxima permitida para envio de imagens em pixels (px).",
"image_max_size_tooltip" => "Tamanho máximo permitido para envio de imagens em kilobytes (kb).",
"image_max_width_tooltip" => "Largura máxima permitida para envio de imagens em pixels (px).",
"image_restrictions" => "Restrições no envio de imagens",
"include_hsn" => "Incluir suporte para códigos HSN",
"info" => "Informações",
"info_configuration" => "Informações da loja",
"input_groups" => "",
"integrations" => "Integrações",
"integrations_configuration" => "Integrações de terceiros",
"invoice" => "Fatura",
"invoice_configuration" => "Configuração de Impressão",
"invoice_default_comments" => "Comentário",
"invoice_email_message" => "Modelo de e-mail Fatura",
"invoice_enable" => "Habilitar faturamento",
"invoice_printer" => "Imprimir fatura",
"invoice_type" => "Tipo Fatura",
"is_readable" => "É readable, mas as permissões estão incorretas. Por favor defina para 640 ou 660 e recarregue.",
"is_writable" => "É writable, mas as permissões estão incorretas. Por favor defina para 750 e recarrege.",
"item_markup" => "",
"jsprintsetup_required" => "Aviso! Esta funcionalidade só irá funcionar se você tem o addon FireFox jsPrintSetup instalado. Salvar de qualquer maneira?",
"language" => "Linguagem",
"last_used_invoice_number" => "Último número de fatura usado",
"last_used_quote_number" => "Último número de cotação usada",
"last_used_work_order_number" => "Último número de ordem de serviço usado",
"left" => "Esquerda",
"license" => "Licenças",
"license_configuration" => "Declaração de licença",
"line_sequence" => "Sequência de Linhas",
"lines_per_page" => "Linhas por página",
"lines_per_page_number" => "Linhas por página deve ser um número.",
"lines_per_page_required" => "As linhas por página é um campo obrigatório.",
"locale" => "Localização",
"locale_configuration" => "Configuração de Localização",
"locale_info" => "Informações da Configuração de Localização",
"location" => "Estoque",
"location_configuration" => "Localização do Estoque",
"location_info" => "Informações da localização",
"login_form" => "",
"logout" => "Você não quer fazer uma cópia de segurança antes de sair? Clique [OK] para fazer a cópia de segurança.",
"mailchimp" => "Configuração Mailchimp",
"mailchimp_api_key" => "Mailchimp chave API",
"mailchimp_configuration" => "Configuração Mailchimp",
"mailchimp_key_successfully" => "API chave válida.",
"mailchimp_key_unsuccessfully" => "API chave inválida.",
"mailchimp_lists" => "Lista(s) Mailchimp",
"mailchimp_tooltip" => "Clique no ícone de uma chave de API.",
"message" => "Mensagem",
"message_configuration" => "Configuração de Mensagens",
"msg_msg" => "Salvar mensagem de texto",
"msg_msg_placeholder" => "Se você deseja usar um modelo de SMS salvar a sua mensagem aqui. Caso contrário, deixe a caixa em branco.",
"msg_pwd" => "SMS-API senha",
"msg_pwd_required" => "SMS-API Senha é um campo obrigatório",
"msg_src" => "SMS-API Remetente ID",
"msg_src_required" => "SMS-API Remetente ID é um campo obrigatório",
"msg_uid" => "SMS-API usuário",
"msg_uid_required" => "SMS-API usuário é um campo obrigatório",
"multi_pack_enabled" => "Vários pacotes por item",
"no_risk" => "No security/vulnerability risks.",
"none" => "nenhum",
"notify_alignment" => "Notificação Posição Popup",
"number_format" => "Formato do número",
"number_locale" => "Localização",
"number_locale_invalid" => "A localidade digitada é inválida. Verifique o link na dica para encontrar um valor aceitável.",
"number_locale_required" => "Número Local é um campo obrigatório.",
"number_locale_tooltip" => "Encontrar um local adequado através deste link.",
"os_timezone" => "Fuso horário do OSPOS:",
"ospos_info" => "Informações de instalação do OSPOS",
"payment_options_order" => "Opções da ordem de pagamento",
"perm_risk" => "Permissões incorretas deixam este software em risco.",
"phone" => "Telefone",
"phone_required" => "Telefone da Empresa é requerido.",
"print_bottom_margin" => "Margem inferior",
"print_bottom_margin_number" => "A margem inferior padrão deve ser um número.",
"print_bottom_margin_required" => "A margem inferior padrão é um campo obrigatório.",
"print_delay_autoreturn" => "Retorno automático para atraso de venda",
"print_delay_autoreturn_number" => "Retorno automático para venda é um campo obrigatório.",
"print_delay_autoreturn_required" => "Retorno automático para devolução de venda deve ser um número.",
"print_footer" => "Imprimir rodapé do navegador",
"print_header" => "Imprimir o cabeçalho do navegador",
"print_left_margin" => "Margem esquerda",
"print_left_margin_number" => "A margem esquerda padrão deve ser um número.",
"print_left_margin_required" => "A margem esquerda padrão é um campo obrigatório.",
"print_receipt_check_behaviour" => "Caixa seleção Recibo de impressão",
"print_receipt_check_behaviour_always" => "Sempre verificado",
"print_receipt_check_behaviour_last" => "Lembre-se da última seleção",
"print_receipt_check_behaviour_never" => "Sempre desmarcado",
"print_right_margin" => "Margem Direita",
"print_right_margin_number" => "A margem direita padrão deve ser um número.",
"print_right_margin_required" => "A margem direita padrão é um campo obrigatório.",
"print_silently" => "Mostrar caixa de diálogo de impressão",
"print_top_margin" => "Margem superior",
"print_top_margin_number" => "A margem superior padrão deve ser um número.",
"print_top_margin_required" => "A margem superior padrão é um campo obrigatório.",
"quantity_decimals" => "Número de decimais",
"quick_cash_enable" => "",
"quote_default_comments" => "Comentários de cotação padrão",
"receipt" => "Recibo",
"receipt_category" => "",
"receipt_configuration" => "Configuração de Impressão",
"receipt_default" => "Padrão",
"receipt_font_size" => "Tamanho da fonte",
"receipt_font_size_number" => "Tamanho da fonte deve ser um número.",
"receipt_font_size_required" => "Tamanho da fonte é requerido.",
"receipt_info" => "Informações de configuração de Recibos",
"receipt_printer" => "Imprimir recibo",
"receipt_short" => "Pequeno",
"receipt_show_company_name" => "Mostrar nome da empresa",
"receipt_show_description" => "Exibir descrição",
"receipt_show_serialnumber" => "Exibir número serial",
"receipt_show_tax_ind" => "Mostrar indicator de impostos",
"receipt_show_taxes" => "Mostrar Impostos",
"receipt_show_total_discount" => "Mostrar total desconto",
"receipt_template" => "Modelo de recibo",
"receiving_calculate_average_price" => "Calc Médio de Preço (Recebimento)",
"recv_invoice_format" => "Formato da fatura de recebimento",
"register_mode_default" => "Modo de registro padrão",
"report_an_issue" => "Reporte um problema",
"return_policy_required" => "A política de devolução é um campo obrigatório.",
"reward" => "Recompensa",
"reward_configuration" => "Configuração de recompensa",
"right" => "Direita",
"sales_invoice_format" => "Formato da Fatura de Vendas",
"sales_quote_format" => "Formato de cotação de vendas",
"mailpath_invalid" => "Caminho do sendmail inválido. Apenas letras, números, traços, sublinhados, barras e pontos são permitidos.",
"saved_successfully" => "Configuração salva com sucesso.",
"saved_unsuccessfully" => "Configuração não salva.",
"security_issue" => "Security Vulnerability Warning",
"server_notice" => "Por favor, use as informações abaixo para o relatório de problemas.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Mostrar ícone do escritório",
"statistics" => "Enviar estatísticas",
"statistics_tooltip" => "Envie estatísticas para desenvolvimento e aprimoramento de recursos.",
"stock_location" => "Localização do Estoque",
"stock_location_duplicate" => "Por favor, use um nome de localização única.",
"stock_location_invalid_chars" => "O nome do local de ações não pode conter '_'.",
"stock_location_required" => "Número da localização do estoque é um campo obrigatório.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Coluna 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Layout de sugestões de pesquisa",
"suggestions_second_column" => "Coluna 2",
"suggestions_third_column" => "Coluna 3",
"system_conf" => "Setup & Conf",
"system_info" => "System Info",
"table" => "Mesa",
"table_configuration" => "Configuração da mesa",
"takings_printer" => "Imprimir Vendas",
"tax" => "Imp",
"tax_category" => "Categoria de imposto",
"tax_category_duplicate" => "A categoria de imposto inserida já existe.",
"tax_category_invalid_chars" => "A categoria de imposto inserida é inválida.",
"tax_category_required" => "A categoria de imposto é obrigatória.",
"tax_category_used" => "A categoria de imposto não pode ser excluída porque está sendo usada.",
"tax_configuration" => "Configuração de impostos",
"tax_decimals" => "Decimais da taxa",
"tax_id" => "Id imposto",
"tax_included" => "Imposto Incluído",
"theme" => "Tema",
"theme_preview" => "",
"thousands_separator" => "Separador de milhar",
"timezone" => "Fuso horário",
"timezone_error" => "O fuso horário do OSPOS é diferente do fuso horário local.",
"top" => "Topo",
"use_destination_based_tax" => "Use o Imposto Baseado em Destino",
"user_timezone" => "Fuso horário local:",
"website" => "OSPOS",
"wholesale_markup" => "",
"work_order_enable" => "Suporte para Ordem de Serviço",
"work_order_format" => "Formato Ordem de Serviço",
];