Files
opensourcepos/app/Language/bs/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" => "Adresa kompanije",
"address_required" => "Adresa kompanije je obavezno polje.",
"all_set" => "Sva su dopuštenja datoteka ispravno postavljena!",
"allow_duplicate_barcodes" => "Dozvoli dvostruke barkodove",
"apostrophe" => "apostrof",
"backup_button" => "Rezervna kopija",
"backup_database" => "Rezervna kopija baze podataka",
"barcode" => "Barkod",
"barcode_company" => "Kompanija",
"barcode_configuration" => "Konfiguracija barkoda",
"barcode_content" => "Sadržaj barkoda",
"barcode_first_row" => "1 red",
"barcode_font" => "Font",
"barcode_formats" => "Unesi format",
"barcode_generate_if_empty" => "Generiši ako je prazno.",
"barcode_height" => "Visina(px)",
"barcode_id" => "Id / naziv artikla",
"barcode_info" => "Informacije o konfiguraciji barkoda",
"barcode_layout" => "Izgled barkoda",
"barcode_name" => "Naziv",
"barcode_number" => "Barkod",
"barcode_number_in_row" => "Broj u redu",
"barcode_page_cellspacing" => "Prikaži razmak ćelija na stranici.",
"barcode_page_width" => "Širina stranice",
"barcode_price" => "Cijena",
"barcode_second_row" => "2.red",
"barcode_third_row" => "3.red",
"barcode_tooltip" => "Upozorenje: Ova funkcija može prouzrokovati uvoz ili kreiranje duplikata. Ne koristite ako ne želite duple barkodove.",
"barcode_type" => "Tip barkoda",
"barcode_width" => "Širina (px)",
"bottom" => "Dno",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "Decimale gotovine",
"cash_decimals_tooltip" => "Ako su Decimale gotovine i Valutne decimale iste, onda neće biti zaokruživanja gotovine.",
"cash_rounding" => "Zaokruživanje gotovine",
"category_dropdown" => "Prikaži kategoriju kao padajući meni",
"center" => "Centar",
"change_apperance_tooltip" => "",
"comma" => "zarez",
"company" => "Kompanija",
"company_avatar" => "",
"company_change_image" => "Promijeni logo",
"company_logo" => "Logo kompanije",
"company_remove_image" => "Ukloni logo",
"company_required" => "Naziv kompanije je obavezno polje",
"company_select_image" => "Izaberite sliku",
"company_website_url" => "Veb lokacija kompanije nije važeća URL adresa (http://...).",
"country_codes" => "Kod zemlje",
"country_codes_tooltip" => "Lista kodova zemalja odvojena zarezima za traženje nominalnih adresa.",
"currency_code" => "Kod valute",
"currency_decimals" => "Velutne decimale",
"currency_symbol" => "Simbol valute",
"current_employee_only" => "",
"customer_reward" => "Nagrada",
"customer_reward_duplicate" => "Nagrada mora biti jedinstvena.",
"customer_reward_enable" => "Omogući nagrade kupcima",
"customer_reward_invalid_chars" => "Nagrada ne može sadržavati '_'",
"customer_reward_required" => "Nagrada je obavezno polje",
"customer_sales_tax_support" => "",
"date_or_time_format" => "Filter datuma i vremena",
"datetimeformat" => "Format datuma i vremena",
"decimal_point" => "Decimalna točka",
"default_barcode_font_size_number" => "Veličina fonta za barkod mora biti broj.",
"default_barcode_font_size_required" => "Veličina fonta barkoda je obavezno polje.",
"default_barcode_height_number" => "Visina barkoda mora biti broj.",
"default_barcode_height_required" => "Visina barkoda je obavezno polje.",
"default_barcode_num_in_row_number" => "Broj barkoda u redu mora biti broj.",
"default_barcode_num_in_row_required" => "Broj barkoda u redu je obavezno polje.",
"default_barcode_page_cellspacing_number" => "Razmak između ćelija sa barkodom mora biti broj.",
"default_barcode_page_cellspacing_required" => "Rastojanje ćelija na stranici sa barkodom je obavezno polje.",
"default_barcode_page_width_number" => "Širina stranice sa bar kodom mora biti broj.",
"default_barcode_page_width_required" => "Širina stranice sa barkodom je obavezno polje.",
"default_barcode_width_number" => "Standardna širina barkoda mora biti broj.",
"default_barcode_width_required" => "Širina barkoda je obavezno polje.",
"default_item_columns" => "Vidljiva stavka kolone",
"default_origin_tax_code" => "Šifra poreza",
"default_receivings_discount" => "Popust za ulaze",
"default_receivings_discount_number" => "Popust za ulaz mora biti broj.",
"default_receivings_discount_required" => "Popust za ulaz je obavezno polje.",
"default_sales_discount" => "Popust na prodaju",
"default_sales_discount_number" => "Popust na prodaju mora biti broj.",
"default_sales_discount_required" => "Popust na prodaju je obavezno polje.",
"default_tax_category" => "Poreska kategorija",
"default_tax_code" => "Poreska šifra",
"default_tax_jurisdiction" => "Poreska uprava",
"default_tax_name_number" => "Naziv poreza mora biti string.",
"default_tax_name_required" => "Naziv poreza je obavezno polje.",
"default_tax_rate" => "Stopa poreza %",
"default_tax_rate_1" => "Stopa poreza 1 %",
"default_tax_rate_2" => "Stopa poreza 2 %",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "Stopa poreza mora biti broj.",
"default_tax_rate_required" => "Stopa poreza je obavezno polje.",
"derive_sale_quantity" => "Dozvoli izvedenu količinu prodaje",
"derive_sale_quantity_tooltip" => "Ako se izabere, za artikle naručene po produženom iznosu biće obezbjeđen novi tip artikla",
"dinner_table" => "Sto",
"dinner_table_duplicate" => "Sto mora biti jedinstven.",
"dinner_table_enable" => "Omogući stolove za večeru",
"dinner_table_invalid_chars" => "Naziv stola ne može sadržavati '_'.",
"dinner_table_required" => "Sto je obavezno polje.",
"dot" => "tačka",
"email" => "E-mail",
"email_configuration" => "Konfiguracija e-mail",
"email_mailpath" => "Putanja do Sendmaila",
"email_protocol" => "Protokol",
"email_receipt_check_behaviour" => "Polje za potvrdu e-mail",
"email_receipt_check_behaviour_always" => "Uvijek potvrđeno",
"email_receipt_check_behaviour_last" => "Zapamti poslednji izbor",
"email_receipt_check_behaviour_never" => "Uvijek nepotvrđeno",
"email_smtp_crypto" => "SMTP šifriranje",
"email_smtp_host" => "SMTP Server",
"email_smtp_pass" => "SMTP Lozinka",
"email_smtp_port" => "SMTP Port",
"email_smtp_timeout" => "SMTP pauza",
"email_smtp_user" => "SMTP Korisničko ime",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Ostvarite privatnost",
"enforce_privacy_tooltip" => "Zaštitite privatnost kupaca primjenjujući kodiranje podataka u slučaju brisanja njihovih podataka",
"fax" => "Faks",
"file_perm" => "Postoje problemi sa dozvolama za datoteke, popravite i ponovo učitajte ovu stranicu.",
"financial_year" => "Početak fiskalne godine",
"financial_year_apr" => "1. April",
"financial_year_aug" => "1. Avgust",
"financial_year_dec" => "1. Decembar",
"financial_year_feb" => "1. Februar",
"financial_year_jan" => "1. Januar",
"financial_year_jul" => "1. Juli",
"financial_year_jun" => "1. Juni",
"financial_year_mar" => "1. Mart",
"financial_year_may" => "1. Maj",
"financial_year_nov" => "1. Novembar",
"financial_year_oct" => "1. Oktobar",
"financial_year_sep" => "1. Septembar",
"floating_labels" => "Plutajuće etikete",
"gcaptcha_enable" => "Stranica za prijavu reCAPTCHA",
"gcaptcha_secret_key" => "reCAPTCHA tajni ključ",
"gcaptcha_secret_key_required" => "reCAPTCHA tajni ključ je obavezno polje",
"gcaptcha_site_key" => "reCAPTCHA ključ sajta",
"gcaptcha_site_key_required" => "reCAPTCHA Ključ sajta je obavezno polje",
"gcaptcha_tooltip" => "Zaštitite stranicu za prijavu pomoću Google reCAPTCHA, kliknite na ikonu za par API ključeva.",
"general" => "Generalno",
"general_configuration" => "Opšta konfiguracija",
"giftcard_number" => "Broj poklon kartice",
"giftcard_random" => "Generiši nasumice",
"giftcard_series" => "Generiši u seriji",
"image_allowed_file_types" => "Dozvoljeni tipovi datoteka",
"image_max_height_tooltip" => "Maksimalna dozvoljena visina učitavanja slike u pikselima (px).",
"image_max_size_tooltip" => "Maksimalna dozvoljena veličina datoteke za prijenos slike u kilobajtima (kb).",
"image_max_width_tooltip" => "Maksimalna dozvoljena širina slike u pikselima (px).",
"image_restrictions" => "Ograničenja za učitavanje slike",
"include_hsn" => "Uključite podršku za HSN kodove",
"info" => "Informacije",
"info_configuration" => "Info o web trgovini",
"input_groups" => "Grupe unosa",
"integrations" => "Integracije",
"integrations_configuration" => "Integracije trećih strana",
"invoice" => "Faktura",
"invoice_configuration" => "Podešavanja štamapnja",
"invoice_default_comments" => "Komentar na fakturi",
"invoice_email_message" => "Predložak e-mail za fakture",
"invoice_enable" => "Omogući fakturisanje",
"invoice_printer" => "Štampanje faktura",
"invoice_type" => "Tip fakture",
"is_readable" => "čitljiv je, ali dozvole su veće od 660.",
"is_writable" => "može se napisati, ali dozvole su veće od 750.",
"item_markup" => "",
"jsprintsetup_required" => "Upozorenje! Onemogućene opcije će raditi samo ako imate instaliran FireFox jsPrintSetup dodatak. Svakako snimiti?",
"language" => "Jezik",
"last_used_invoice_number" => "Zadnji korišćeni broj fakture",
"last_used_quote_number" => "Zadnji korišćeni broj citata",
"last_used_work_order_number" => "Zadnji korišćeni broj R/N",
"left" => "Lijevo",
"license" => "Licenca",
"license_configuration" => "Izjava o licenci",
"line_sequence" => "Redoslijed linija",
"lines_per_page" => "Linija po stranici",
"lines_per_page_number" => "Redovi po stranici moraju biti broj.",
"lines_per_page_required" => "Broj linija po stranici je obavezno polje.",
"locale" => "Lokalizacija",
"locale_configuration" => "Konfiguracija",
"locale_info" => "Info o lokalnoj konfiguraciji",
"location" => "Skladište",
"location_configuration" => "Lokacije skladišta",
"location_info" => "Informacije o konfiguraciji lokacije",
"login_form" => "Stil formulara za prijavu",
"logout" => "Zar ne želite da napravite rezervnu kopiju prije odjave? Kliknite [OK] za sigurnosnu kopiju, [Cancel] da biste se odjavili.",
"mailchimp" => "MeilChimp",
"mailchimp_api_key" => "MailChimp API ključ",
"mailchimp_configuration" => "MailChimp konfiguracija",
"mailchimp_key_successfully" => "API ključ je važeći.",
"mailchimp_key_unsuccessfully" => "API ključ je nevažeći.",
"mailchimp_lists" => "MailChimp lista(e)",
"mailchimp_tooltip" => "Kliknite na ikonu za API ključ.",
"message" => "Poruke",
"message_configuration" => "Konfigurisanje poruke",
"msg_msg" => "Snimljena tekst poruka",
"msg_msg_placeholder" => "Ako želite koristiti SMS šablon, snimite poruku ovdje. U suprotnom ostavite prazno polje.",
"msg_pwd" => "SMS-API lozinke",
"msg_pwd_required" => "SMS-API lozinke je obavezno polje",
"msg_src" => "SMS-API ID pošiljaoca",
"msg_src_required" => "SMS-API Id pošiljaoca je obavezno polje",
"msg_uid" => "SMS-API korisnika",
"msg_uid_required" => "SMS-API korisnika je obavezno polje",
"multi_pack_enabled" => "Više pakovanja po stavci",
"no_risk" => "Nema rizika / ugroženosti.",
"none" => "nijedan",
"notify_alignment" => "Položaj iskačuće obavijesti",
"number_format" => "Format broja",
"number_locale" => "Lokalizacija",
"number_locale_invalid" => "Unijeti jezik je nevažeći. Provjerite vezu u opisu alatke da biste pronašli važeći jezik.",
"number_locale_required" => "Broj lokacije je obavezno polje.",
"number_locale_tooltip" => "Pronađite odgovarajuću lokaciju na ovom linku.",
"os_timezone" => "OSPOS vremenska zona:",
"ospos_info" => "OSPOS instalacione informacije",
"payment_options_order" => "Narudžba opcije plaćanja",
"perm_risk" => "Dozvole veće od 750 za pisanje i 660 za čitanje dovode ovaj program u rizik.",
"phone" => "Telefon kompanije",
"phone_required" => "Telefon kompanije je obavezno polje.",
"print_bottom_margin" => "Donja margina",
"print_bottom_margin_number" => "Donja margina mora biti broj.",
"print_bottom_margin_required" => "Donja margina je obavezno polje.",
"print_delay_autoreturn" => "Automatski povratak na odgodu prodaje",
"print_delay_autoreturn_number" => "Odgoda automatskog povratka na prodaju je obavezno polje.",
"print_delay_autoreturn_required" => "Odlaganje automatskog povratka na prodaju mora biti broj.",
"print_footer" => "Štampanje podnožja",
"print_header" => "Štampanje zaglavlja",
"print_left_margin" => "Lijeva margina",
"print_left_margin_number" => "Lijeva margina mora biti broj.",
"print_left_margin_required" => "Lijeva margina je obavezno polje.",
"print_receipt_check_behaviour" => "Polje za potvrdu štampanja računa",
"print_receipt_check_behaviour_always" => "Uvijek potvrđeno",
"print_receipt_check_behaviour_last" => "Zapamti poslednji izbor",
"print_receipt_check_behaviour_never" => "Uvijek nepotvrđeno",
"print_right_margin" => "Desna margina",
"print_right_margin_number" => "Desna margina mora biti broj.",
"print_right_margin_required" => "Desna margina je obavezno polje.",
"print_silently" => "Prikaži dijalog za štampanje",
"print_top_margin" => "Gornja margina",
"print_top_margin_number" => "Gornja margina mora biti broj.",
"print_top_margin_required" => "Gornja margina je obavezno polje.",
"quantity_decimals" => "Decimale količine",
"quick_cash_enable" => "",
"quote_default_comments" => "Difoltni komentari citata",
"receipt" => "Račun",
"receipt_category" => "",
"receipt_configuration" => "Podešavanja štamapnja",
"receipt_default" => "Podrazumijevano",
"receipt_font_size" => "Veličina fonta",
"receipt_font_size_number" => "Veličina fonta mora biti broj.",
"receipt_font_size_required" => "Veličina fonta je obavezno polje.",
"receipt_info" => "Informacije o POS računu",
"receipt_printer" => "POS štampač",
"receipt_short" => "Kratko",
"receipt_show_company_name" => "Prikaži kompaniju",
"receipt_show_description" => "Prikaži opis",
"receipt_show_serialnumber" => "Prikaži serijski broj",
"receipt_show_tax_ind" => "Prikaži poreski indikator",
"receipt_show_taxes" => "Prikaži porez",
"receipt_show_total_discount" => "Prikaži ukupni popust",
"receipt_template" => "Šablon računa",
"receiving_calculate_average_price" => "Izrač. prosječnih cijena (ulaza)",
"recv_invoice_format" => "Format računa fakture",
"register_mode_default" => "Mod registracije",
"report_an_issue" => "Prijavi problem",
"return_policy_required" => "Politika povrata je obavezno polje.",
"reward" => "Nagrada",
"reward_configuration" => "Konfigurisanje poklona",
"right" => "Desno",
"sales_invoice_format" => "Format fakture",
"sales_quote_format" => "Format navedene prodaje",
"mailpath_invalid" => "",
"saved_successfully" => "Konfiguracija je uspješno snimljena.",
"saved_unsuccessfully" => "Konfiguracija nije uspješno snimljena.",
"security_issue" => "Upozorenje o sigurnosnoj ranjivosti",
"server_notice" => "Koristite informacije u nastavku za prijavljivanje problema.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Prikaži ikonu kancelarije",
"statistics" => "Pošalji statistiku",
"statistics_tooltip" => "Pošaljite statistiku u svrhu razvoja i poboljšanja funkcija.",
"stock_location" => "Lokacija skladišta",
"stock_location_duplicate" => "Lokacija zaliha mora biti jedinstvena.",
"stock_location_invalid_chars" => "Lokacija skaldišta ne može sadržavati '_'.",
"stock_location_required" => "Lokacija skladišta je obavezno polje.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Kolona 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Prijedlozi za pretraživanje",
"suggestions_second_column" => "Kolona 2",
"suggestions_third_column" => "Kolona 3",
"system_conf" => "Podešavanja & Konf",
"system_info" => "Sistem Info",
"table" => "Sto",
"table_configuration" => "Konfigurisanje stola",
"takings_printer" => "Štampanje računa",
"tax" => "Porez",
"tax_category" => "Kategorija",
"tax_category_duplicate" => "Unesena kategorija već postoji.",
"tax_category_invalid_chars" => "Unesena kategorija je nevažeća.",
"tax_category_required" => "Obavezna je kategorija.",
"tax_category_used" => "Kategorija se ne može izbrisati jer se koristi.",
"tax_configuration" => "Konfigurisanje poreza",
"tax_decimals" => "Poreske decimale",
"tax_id" => "ID poreza",
"tax_included" => "Uključen porez",
"theme" => "Tema",
"theme_preview" => "Pregled teme:",
"thousands_separator" => "Separator za hiljade",
"timezone" => "Vremenska zona",
"timezone_error" => "Vremenska zona OSPOS razlikuje se od vaše lokalne vremenske zone.",
"top" => "Vrh",
"use_destination_based_tax" => "Koristite porez na osnovu odredišta",
"user_timezone" => "Lokalna vremenska zona:",
"website" => "web stranica",
"wholesale_markup" => "",
"work_order_enable" => "Podnošenje radnog naloga",
"work_order_format" => "Format radnog naloga",
];