proftpd/0040755000567100000120000000000007401421103012210 5ustar jcameronwheelproftpd/lang/0040755000567100000120000000000007401421102013130 5ustar jcameronwheelproftpd/lang/en0100644000567100000120000003727607401421102013471 0ustar jcameronwheelindex_title=ProFTPD Server index_eproftpd=The ProFTPD server $1 could not be found on your system. Maybe it is not installed, or your module configuration is incorrect. index_eproftpd2=The program $1 does not appear to be the ProFTPD server. Maybe it is not installed, or your module configuration is incorrect. index_eversion=The version of ProFTPD server $1 is not supported by Webmin. Only versions 0.99 and above are supported. index_econf=The ProFTPD config file $1 does not exist or is not valid. Maybe your module configuration is incorrect. index_apply=Apply Changes index_applymsg=Click this button to apply the current configuration by sending a SIGHUP signal to the running ProFTPD process. index_start=Start Server index_startmsg=Click this button to start the FTP server with the current configuration. You can also configure the server to be started automatically when needed using the Internet Services module. index_startmsg2=Click this button to start the FTP server with the current configuration. You can also configure the server to be started automatically when needed using inetd or some equivalent program. index_return=main menu index_virts=Virtual Servers index_virt=Virtual Server index_type=Server type index_addr=Address index_name=Server name index_port=FTP port index_defserv=Default server index_defdesc=Handles any FTP connections not handled by virtual servers. index_any=Any index_vdesc=Handles all connections to $1 index_eip=<Unknown> index_global=Global Configuration index_create=Create virtual server efailed=Failed to save $1 type_0=Networking Options type_1=Logging Options type_2=Files and Directories type_3=Access Control type_4=Miscellaneous type_5=User and Group type_6=Authentication virt_title=Virtual Server Options virt_header1=For $1 virt_header2=For default server virt_header3=$1 options virt_anon=Anonymous FTP virt_header=Per-directory and Per-command options virt_dir=Directory $1 virt_limit=Commands $1 virt_adddir=Add per-directory options for .. virt_addlimit=Add per-command options for .. virt_path=Directory path virt_cmds=FTP commands virt_return=virtual server virt_virt=Configure Virtual Server virt_edit=Edit Directives vserv_title=Configure Virtual Server vserv_addr=Address vserv_name=Server name vserv_port=FTP port vserv_delete=Delete virtual server vserv_eaddr=Missing or invalid address vserv_eport=Missing or invalid port number vserv_ename=Missing server name anon_title=Anonymous FTP Options anon_header1=In virtual server $1 anon_header2=In default server anon_anon=Configure Anonymous FTP anon_return=anonymous FTP options anon_header3=For anonymous FTP in virtual server $1 anon_header4=For anonymous FTP in default server aserv_title=Configure Anonymous FTP aserv_create=Setup Anonymous FTP aserv_root=Chroot directory aserv_user=Access files as user aserv_group=Access files as group aserv_err=Failed to save anonymous FTP aserv_eroot=Missing or invalid chroot directory aserv_euser=Missing or invalid Unix user aserv_egroup=Missing or invalid Unix group aserv_desc=Anonymous FTP has not yet been setup for this virtual server. Use this form to set the initial configuration options. dir_title=Per-Directory Options dir_header2=For directory $1 in default server dir_header1=For directory $1 in virtual server $2 dir_edit=Edit Directives dir_return=per-directory options dir_header3=$1 options in $2 dir_header=Per-command options dir_dir=Configure Directory dir_header4=For directory $1 in anonymous FTP manual_title=Edit Directives manual_header=Use the text box below to manually edit the ProFTPD directives in $1 that apply to this virtual server, directory or commands. limit_title=Per-Command Options limit_header4=For commands $1 in directory $2 limit_header2=For commands $1 in default server limit_header1=For commands $1 in virtual server $2 limit_edit=Edit Directives limit_limit=Configure Commands limit_header3=$1 options for commands $2 limit_return=per-command options limit_header5=For commands $1 in anonymous FTP limit_header6=For commands $1 in file $2 lserv_title=Configure Commands lserv_cmd=FTP commands lserv_delete=Delete commands config lserv_err=Failed to save commands lserv_ecmd=No commands selected dserv_title=Configure Directory dserv_dir=Directory path dserv_err=Failed to save directory dserv_edir=Missing directory path dserv_delete=Delete directory config mod_core_type=Server type mod_core_inetd=Run from Inetd mod_core_stand=Stand-alone daemon mod_core_port=Listen on port mod_core_eport=Missing or invalid port number mod_core_servername=Server name displayed to users mod_core_eservername=Missing server name mod_core_defaultserver=Use this virtual server by default? mod_core_instances=Maximum concurrent sessions mod_core_einstances=Missing or invalid number of sessions mod_core_umask=New file umask mod_core_eumask=Missing or invalid umask mod_core_user=Run as Unix user mod_core_uname=User name mod_core_uid=UID mod_core_group=Run as Unix group mod_core_gname=Group name mod_core_gid=GID mod_core_tlog=FTP transfers logfile mod_core_etlog=Missing or invalid transfers logfile mod_core_accessdeny=Failed login message mod_core_accessgrant=Successful login message mod_core_adall=Access control policy mod_core_addefault=Same as parent mod_core_allowall=Allow all clients mod_core_denyall=Deny all clients mod_core_filter=Allowed FTP commands regexp mod_core_foreign=Allow foreign data transfers? mod_core_overwrite=Allow overwriting of files? mod_core_restart=Allow restarted downloads? mod_core_restart2=Allow restarted uploads? mod_core_require=Require password for anonymous login? mod_core_anongroup=Groups to treat members as anonymous mod_core_eanongroup=No anonymous group entered mod_core_authalias=Only allow aliased users to login? mod_core_authusingalias=Use alias password for anonymous login? mod_core_bind=Bind to address mod_core_bind_all=All addresses mod_core_ebind=Missing or invalid bind address mod_core_cdpath=Shortcut CD directories mod_core_classes=Enable classes for access control? mod_core_cls=Access control classes mod_core_cname=Class name mod_core_ctype=Type and value mod_core_climit=Max connections mod_core_cregex=Client hostname match mod_core_cip=Client IP network/CIDR mod_core_eclimit=Missing or invalid max connections mod_core_ecregex=Missing client hostname match mod_core_ecip=Missing or invalid client IP network/CIDR mod_core_buffer=Maximum FTP command length mod_core_ebuffer=Missing or invalid maximum command length mod_core_transfer=Default transfer mode mod_core_binary=Binary mod_core_ascii=ASCII mod_core_defer=Defer welcome message until after login? mod_core_aborted=Deleted aborted uploads? mod_core_dfilter=Denied FTP commands regexp mod_core_display=Pre-login message file mod_core_none=None mod_core_edisplay=Missing pre-login message file mod_core_firstcd=Directory README filename mod_core_efirstcd=Missing directory README filename mod_core_goaway=Too many connections message file mod_core_egoaway=Missing too many connections file mod_core_login=Post-login message file mod_core_elogin=Missing post-login message file mod_core_quit=Logout message file mod_core_equit=Missing logout message file mod_core_gowner=Group owner of uploaded files mod_core_egowner=Missing or invalid group for uploaded files mod_core_grouppassword=Group passwords mod_core_gpname=Unix group mod_core_gppass=Password mod_core_gpdef=Leave unchanged mod_core_egpname=Invalid Unix group name mod_core_hstor=Hide uploaded files? mod_core_hgroup=Hide files owned by groups mod_core_ehgroup=Invalid group name to hide files of mod_core_hnoaccess=Hide files that cannot be accessed? mod_core_huser=Hide files owned by users mod_core_ehuser=Invalid user name to hide files of mod_core_ident=Lookup remote Ident username? mod_core_ihidden=Make hidden files inaccessible? mod_core_masq=Masquerade as address mod_core_masq_def=Use real address mod_core_emasq=Missing or invalid masquerade address mod_core_maxc=Maximum concurrent logins mod_core_maxc1=Unlimited mod_core_maxcmsg=Login error message mod_core_emaxc=Missing or invalid maximum number of logins mod_core_maxch=Maximum concurrent logins per host mod_core_maxcu=Maximum concurrent logins per user mod_core_logins=Maximum failed logins per session mod_core_elogins=Missing or invalid number of failed logins mod_core_rfc2228=Send RFC2228-style responses? mod_core_pasv=PASV port range mod_core_pasvr=Min - max mod_core_epasv=Missing or invalid PASV port number mod_core_pathallow=Allowed uploaded filename regex mod_core_any=Any mod_core_pathdeny=Denied uploaded filename regex mod_core_pidfile=Write PID to file mod_core_epidfile=Missing or invalid PID file mod_core_shell=Only allow login by users with valid shell? mod_core_cpulimit=CPU resource limits mod_core_ecpulimit=CPU resource limit mod_core_memlimit=Memory resource limits mod_core_ememlimit=memory resource limit mod_core_filelimit=Open files limits mod_core_efilelimit=open files limit mod_core_soft=Soft limit: mod_core_hard=Hard limit: mod_core_max=Maximum mod_core_esoft=Missing or invalid soft $1 mod_core_ehard=Missing or invalid hard $1 mod_core_score=Path to scoreboard directory mod_core_escore=Missing or invalid scoreboard directory mod_core_admin=Server administrator's email address mod_core_eadmin=Missing or invalid email address mod_core_identmsg=Client connection message mod_core_identmsg_def=Show default message mod_core_links=Show symbolic links? mod_core_tight=Only bind to needed ports? mod_core_facility=System log facility mod_core_level=System log level mod_core_backlog=TCP backlog queue length mod_core_ebacklog=Missing or invalid backlog queue length mod_core_nodelay=Use TCP_NODELAY socket option? mod_core_rwindow=TCP receive window size mod_core_erwindow=Missing or invalid receive window size mod_core_swindow=TCP send window size mod_core_eswindow=Missing or invalid send window size mod_core_gmt=Show times in GMT? mod_core_tidle=Idle time before disconnecting mod_core_etidle=Missing or invalid idle time mod_core_secs=seconds mod_core_tlogin=Time to wait for authentication mod_core_etlogin=Missing or invalid authentication time mod_core_ttransfer=Time to wait for first transfer mod_core_ettransfer=Missing or invalid first transfer time mod_core_tstalled=Time to wait for stalled data transfer mod_core_etstalled=Missing or invalid stalled transfer time mod_core_ftpusers=Deny users in /etc/ftpusers file? mod_core_hostsallow=Hosts to allow file mod_core_ehostsallow=Hosts to allow file does not exist mod_core_hostsdeny=Hosts to deny file mod_core_ehostsdeny=Hosts to deny file does not exist mod_core_revdns=Do reverse DNS lookups of client addresses? mod_core_userdir=Chroot to username subdirectory? mod_core_ualias=Username aliases mod_core_afrom=Login username mod_core_ato=Real username mod_core_eafrom=Invalid login username in alias mod_core_eato=Missing or invalid real username in alias mod_core_uowner=Owner of uploaded files mod_core_euowner=Missing or invalid owner for uploaded files mod_core_userpassword=User passwords overrides mod_core_upname=Unix user mod_core_uppass=Password mod_core_updef=Leave unchanged mod_core_eupname=Invalid Unix user name mod_core_wtmp=Record logins in wtmp? mod_core_allow_deny=Restrict access mod_core_allowdeny=Allow then deny mod_core_denyallow=Deny then allow mod_core_allow=Allow mod_core_deny=Deny mod_core_mode_0=All mod_core_mode_1=None mod_core_mode_2=IP address mod_core_mode_3=Network mod_core_mode_4=Hostname mod_core_cond=Condition mod_core_action=Action mod_core_agroup=Only allow groups mod_core_auser=Only allow users mod_core_all=All mod_core_dgroup=Deny groups mod_core_duser=Deny users mod_core_eip='$1' is not a valid IP address mod_core_enet='$1' is not a valid network address mod_core_ehost='$1' is not a valid hostname mod_ls_fakegroup=Fake group in directory listings? mod_ls_fakeuser=Fake user in directory listings? mod_ls_fakemode=Fake permissions in directory listings? mod_ls_dotfiles=Show files starting with . in listings? mod_ls_ls=Additional ls options mod_ls_els=Missing additional ls options mod_auth_chdir=Initial login directory mod_auth_echdir=Missing or invalid initial directory mod_auth_chroot=Chroot directories mod_auth_dir=Directory mod_auth_groups=Unix groups mod_auth_all=Everyone mod_auth_edir=Invalid chroot directory mod_auth_egroups=No Unix groups for chroot entered mod_auth_echroot=Missing or invalid chroot directory mod_auth_login=Don't ask for password if login is denied? mod_auth_root=Allow login by root? mod_site_chmod=Allow chmod command? mod_unixpw_ufile=Alternate Unix password file mod_unixpw_eufile=Missing or invalid Unix password file mod_unixpw_gfile=Alternate Unix group file mod_unixpw_egfile=Missing or invalid Unix group file mod_unixpw_none=None mod_unixpw_pam=Always treat PAM as authorative? mod_unixpw_persist=Keep password file open persistently? mod_log_syslog=Log errors to file mod_log_sysdef=System log mod_log_esyslog=Missing or invalid log file mod_log_extended=Custom logfiles mod_log_file=Logfile mod_log_cmd=For FTP commands mod_log_nick=Log format mod_log_all=All mod_log_ecmd=Missing FTP commands mod_log_enick=Missing or invalid log format name mod_log_ecmdnick=You must enter a log format when specifying commands to log mod_log_nickname=Format name mod_log_fmt=Format string mod_log_format=Custom log formats mod_log_enickname=Missing or invalid format name mod_log_efmt=Missing format string mod_pam_pam=Use PAM for authentication? mod_pam_config=Authenticate using PAM service mod_pam_econfig=Missing or invalid PAM service mod_readme_display=Notify user of readme files matching mod_readme_none=None mod_readme_edisplay=Missing readme files pattern start_err=Failed to start FTP server start_einetd=You cannot start the server daemon when in inetd mode. ftpaccess_title=Per-Directory Options Files ftpaccess_desc=Additional per-directory options can be specified in a file (usually called .ftpaccess) in each directory. The options apply to all files in that directory and any sub-directories, unless overridden by another options file. ftpaccess_create=Create Options File ftpaccess_find=Find Options Files ftpaccess_auto=Under anonymous ftpaccess_from=From directory ftpaccess_return=options file list ftpusers_title=Denied FTP Users ftpusers_desc=If enabled under the Authentication icon, the users listed below from the file $1 will be denied login access to the FTP user. ftpindex_title=Per-Directory Options File ftpindex_delete=Delete File ftpindex_opts=Per-Directory Options ftpindex_edit=Edit Directives ftpindex_limit=Per-command options ftpindex_addlimit=Add per-command options for .. ftpindex_header2=$1 in $2 ftpindex_return=per-directory options file ftpindex_header=For $1 find_err=Failed to find options files find_eanon=Anonymous FTP is not setup in any virtual server log_global=Changed global $1 options log_ftpusers=Changed denied FTP users log_virtc=Created server $1 log_virts=Reconfigured server $1 log_virtd=Deleted server $1 log_virtm=Manually edited server $1 log_virt=Changed $1 in server $2 log_dirc=Created directory $1 log_dirc_l=Created directory $1 in server $2 log_dirs=Changed directory $1 log_dirs_l=Changed directory $1 in server $2 log_dird=Deleted directory $1 log_dird_l=Deleted directory $1 in server $2 log_dirm=Manually edited directory $1 log_dirm_l=Manually edited directory $1 in server $2 log_dir=Changed $1 in directory $2 log_dir_l=Changed $1 in directory $2 in server $3 log_limitc=Created per-command options for $1 log_limits=Reconfigured per-command options for $1 log_limitd=Deleted per-command options for $1 log_limitm=Manually edited per-command options for $1 log_limit=Changed $1 in per-command options for $2 log_ftpaccessc=Created options file $1 log_ftpaccessd=Deleted options file $1 log_ftpaccessm=Manually edited options file $1 log_ftpaccess=Changed $1 in options file $2 log_start=Started proftpd log_apply=Applied changes proftpd/lang/pl0100664000567100000120000004424507401421102013476 0ustar jcameronwheelindex_title=Serwer ProFTPD index_eproftpd=W systemie nie znaleziono serwera ProFTPD $1. Możliwe, że nie został zainstalowany lub Twoja konfiguracja modułu jest nieprawidłowa. index_eproftpd2=Program $1 nie jest serwerem ProFTPD. Możliwe, że ProFTPD nie został zainstalowany lub Twoja konfiguracja modułu jest nieprawidłowa. index_eversion=Webmin nie obsługuje wersji $1 serwera ProFTPD. Obsługiwane są tylko wersje 1.2 i wyższe. index_econf=Plik konfiguracyjny ProFTPD $1 nie istnieje lub jest nieprawidłowy. Możliwe, że Twoja konfiguracja modułu jest nieprawidłowa. index_apply=Zastosuj zmiany index_applymsg=Naciśnij ten przycisk, aby zastosować bierzącą konfigurację poprzez wysłanie sygnału SIGHUP do działającego procesu ProFTPD. index_start=Uruchom serwer index_startmsg=Naciśnij ten przycisk, aby uruchomić serwer FTP z bierzącą konfiguracją. Możesz również skonfigurować serwer, aby był uruchamiany automatycznie w razie potrzeby, korzystając z modułu Usługi internetowe. index_startmsg2=Naciśnij ten przycisk, aby uruchomić serwer FTP z bierzącą konfiguracją. Możesz również skonfigurować serwer, aby był uruchamiany automatycznie w razie potrzeby, korzystając z inetd lub rownoważnego programu. index_return=menu głównego index_virts=Serwery wirtualne index_virt=Serwer wirtualny index_type=Rodzaj serwera index_addr=Adres index_name=Nazwa serwera index_port=Port FTP index_defserv=Serwer domyślny index_defdesc=Obsługuje wszystkie połączenia FTP nie obsługiwane przez serwery wirtualne. index_any=Dowolny index_vdesc=Obsługuje wszystkie połączenia do $1 index_eip=<Nieznany> index_global=Konfiguracja ogólna index_create=Utwórz serwer wirtualny efailed=Nie udało się zachować $1 type_0=Opcje sieci type_1=Opcje logowania type_2=Pliki i katalogi type_3=Kontrola dostępu type_4=Różne type_5=Użytkownicy i grupy type_6=Autoryzacja virt_title=Opcje serwera wirtualnego virt_header1=Dla $1 virt_header2=Dla serwera domyślnego virt_header3=Opcje $1 virt_anon=Anonimowy FTP virt_header=Opcje dla poszczególnych katalogów i poleceń virt_dir=Katalog $1 virt_limit=Polecenia $1 virt_adddir=Dodaj opcje dla katalogu dla .. virt_addlimit=Dodaj opcje dla polecenia dla .. virt_path=Ścieżka do katalogu virt_cmds=Polecenia FTP virt_return=serwera wirtualnego virt_virt=Konfiguruj serwer wirtualny virt_edit=Zmień dyrektywy vserv_title=Konfiguruj serwer wirtualny vserv_addr=Adres vserv_name=Nazwa serwera vserv_port=Port FTP vserv_delete=Usuń serwer wirtualny vserv_eaddr=Nie podany lub niepoprawny adres vserv_eport=Nie podany lub niepoprawny numer portu vserv_ename=Nie podana nazwa serwera anon_title=Opcje anonimowego FTP anon_header1=Dla serwera wirtualnego $1 anon_header2=Dla serwera domyślnego anon_anon=Konfiguruj anonimowy FTP anon_return=opcji anonimowego FTP anon_header3=Dla anonimowego FTP dla serwera wirtualnego $1 anon_header4=Dla anonimowego FTP dla serwera domyślnego aserv_title=Konfiguruj anonimowy FTP aserv_create=Ustaw anonimowy FTP aserv_root=Katalog chroot aserv_user=Dostęp do plików jako użytkownik aserv_group=Dostęp do plików jako grupa aserv_err=Nie udało się zachować anonimowego FTP aserv_eroot=Nie podany lub niepoprawny katalog chroot aserv_euser=Nie podany lub niepoprawny użytkownik Uniksa aserv_egroup=Nie podana lub niepoprawna grupa Uniksa aserv_desc=Nie ustawiono jeszcze anonimowego dostępu FTP dla tego serwera wirtualnego. Ustaw inicjalne opcje konfiguracyjne za pomocę tego formularza. dir_title=Opcje katalogów dir_header2=Dla katalogu $1 dla serwera domyślnego dir_header1=Dla katalogu $1 dla serwera wirtualnego $2 dir_edit=Zmień dyrektywy dir_return=opcji dla katalogów dir_header3=Opcje $1 dla $2 dir_header=Opcje dla poleceń dir_dir=Konfiguruj katalog dir_header4=Dla katalogu $1 anonimowego FTP manual_title=Zmień dyrektywy manual_header=Zmień ręcznie korzystając z poniższego pola tekstowego dyrektywy ProFTPD w $1, które dotyczą tego serwera wirtualnego, katalogu lub poleceń. limit_title=Opcje poleceń limit_header4=Dla poleceń $1 w katalogu $2 limit_header2=Dla poleceń $1 dla serwera domyślnego limit_header1=Dla poleceń $1 dla serwera wirtualnego $2 limit_edit=Zmień dytektywy limit_limit=Konfiguruj polecenia limit_header3=Opcje $1 dla poleceń $2 limit_return=opcji dla poleceń limit_header5=Dla poleceń $1 anonimowego FTP limit_header6=Dla poleceń $1 w pliku $2 lserv_title=Konfiguruj polecenia lserv_cmd=Polecenia FTP lserv_delete=Usuń konfigurację poleceń lserv_err=Nie udało się zachować poleceń lserv_ecmd=Nie wybrano poleceń dserv_title=Konfiguruj katalog dserv_dir=Ścieżka do katalogu dserv_err=Nie udało się zachować katalogu dserv_edir=Nie podana ścieżka do katalogu dserv_delete=Usuń konfigurację katalogu mod_core_type=Rodzaj serwera mod_core_inetd=Uruchamiany przez Inetd mod_core_stand=Demon wolnostojący mod_core_port=Nasłuchiwać na porcie mod_core_eport=Nie podany lub niepoprawny numer portu mod_core_servername=Nazwa serwera pokazująca się użytkownikom mod_core_eservername=Nie podana lub niepoprawna nazwa serwera mod_core_defaultserver=Używać tego serwera wirtualnego jako serwera domyślnego? mod_core_instances=Maksymalna liczba jednoczesnych sesji mod_core_einstances=Nie podana lub niepoprawna liczba sesji mod_core_umask=Nowa umaska dla plików mod_core_eumask=Nie podana lub niepoprawna umaska mod_core_user=Działać jako użytkownik Uniksa mod_core_uname=Nazwa użytkownika mod_core_uid=UID mod_core_group=Działać jako grupa Uniksa mod_core_gname=Nazwa grupy mod_core_gid=GID mod_core_tlog=Plik logowania transferów FTP mod_core_etlog=Nie podany lub niepoprawny plik transferów mod_core_accessdeny=Komunikat o niepomyślnym logowaniu mod_core_accessgrant=Komunikat o pomyślnym logowaniu mod_core_adall=Polityka kontroli dostępu mod_core_addefault=Taka sama jak dla przodka mod_core_allowall=Dopuścić wszystkich klientów mod_core_denyall=Blokować wszystkich klientów mod_core_filter=Wyrażenie regularne dla dozwolonych poleceń FTP mod_core_foreign=Zezwalać na obce transfery danych? mod_core_overwrite=Zezwalać na nadpisywanie plików? mod_core_restart=Zazwalać na kontynuację pobierania? mod_core_restart2=Zazwalać na kontynuację przysyłania? mod_core_require=Wymagać hasła dla logowania anonimowego? mod_core_anongroup=Grupy, których członkowie są traktowani jako anonimowi mod_core_eanongroup=Nie podano anonimowych grup mod_core_authalias=Zezwalać na logowaniw tylko użytkowników z&nbap;aliasami? mod_core_authusingalias=Używać aliasu hasła dla logowania anonimowego mod_core_bind=Nasłuchiwać na adresie mod_core_bind_all=na wszystkich adresach mod_core_ebind=Nie podany lub niepoprawny adres nasłuchiwania mod_core_cdpath=Skróty katalogów dla CD mod_core_classes=Włączyć klasy dla kontroli dostępu mod_core_cls=Klasy kontroli dostępu mod_core_cname=Nazwa klasy mod_core_ctype=Rodzaj i wartość mod_core_climit=Maks. liczba połączeń mod_core_cregex=Dopasowanie nazwy hosta klienta mod_core_cip=IP sieci/CIDR klienta mod_core_eclimit=Nie podana lub niepoprawna maksymalna liczba połączeń mod_core_ecregex=Nie podany lub niepoprawny wzorzec dla nazwy hosta klienta mod_core_ecip=Nie podany lub niepoprawny IP sieci/CIDR klienta mod_core_buffer=Maksymalna długość polecenia FTP mod_core_ebuffer=Nie podana lub niepoprawna maksymalna długość polecenia mod_core_transfer=Domyślny tryb transmisji mod_core_binary=Binarny mod_core_ascii=ASCII mod_core_defer=Opóźniać komunikat powitalny po zalogowaniu? mod_core_aborted=Kasować pliki przysłane w razie przerwania? mod_core_dfilter=Wyrażenie regularne dla zabronionych poleceń FTP mod_core_display=Plik komunikatu poprzedzającego logowanie mod_core_none=Brak mod_core_edisplay=Nie podano komunikatu poprzedzającego logowanie mod_core_firstcd=Nazwa pliku README dla katalogów mod_core_efirstcd=Nie podano nazwy pliku README dla katalogów mod_core_goaway=Plik komunikatu o zbyt wielu połączeniach mod_core_egoaway=Nie podano pliku komunikatu o zbyt wielu połączeniach mod_core_login=Plik komunikatu po zalogowaniu mod_core_elogin=Nie podano pliku komunikatu po zalogowaniu mod_core_quit=Plik komunikatu przy wylogowywaniu mod_core_equit=Nie podano pliku komunikatu przy wylogowywaniu mod_core_gowner=Grupa dla przysyłanych plików mod_core_egowner=Nie podano lub niepoprawna grupa dla przysyłanych plików mod_core_grouppassword=Hasła dla grup mod_core_gpname=Jak dla grupy Uniksa mod_core_gppass=Hasło mod_core_gpdef=Pozostaw nie zmienione mod_core_egpname=Niepoprawna nazwa grupy Uniksa mod_core_hstor=Ukrywać przysyłane pliki? mod_core_hgroup=Ukrywać pliki należące do grup mod_core_ehgroup=Niepoprawna nazwa grupy, której pliki są ukrywane mod_core_hnoaccess=Ukrywać pliki niedostępne? mod_core_huser=Ukrywać pliki należące do użytkowników mod_core_ehuser=Niepoprawna nazwa użytkownika, którego pliki są ukrywane mod_core_ident=Poszukiwać nazw użytkowników zdalnych Identem? mod_core_ihidden=Uczunić pliki ukryte niedostępnymi? mod_core_masq=Maskować jako adres mod_core_masq_def=Używać rzeczywistego adresu mod_core_emasq=Nie podany lub niepoprawny adres dla maskowania mod_core_maxc=Maksymalna liczba jednoczesnych logowań mod_core_maxc1=Nieograniczona mod_core_maxcmsg=Komunikat błędu logowania mod_core_emaxc=Nie podana lub niepoprawna maksymalna liczba logowań mod_core_maxch=Maksymalna liczba logowań z hosta mod_core_maxcu=Maksymalna liczba logowań użytkownika mod_core_logins=Maksymalna liczba nieudanych logowań w sesji mod_core_elogins=Nie podana lub niepoprawna liczba nieudanych logowań mod_core_rfc2228=Wysyłać odpowiedzi zgodne z RFC2228? mod_core_pasv=Zakres portów dla PASV mod_core_pasvr=Min. - maks. mod_core_epasv=Nie podany lub niepoprawny numer portu dla PASV mod_core_pathallow=Wyrażenie regularne dla dozwolonych nazw plików przysyłanych mod_core_any=Dowolna mod_core_pathdeny=Wyrażenie regularne dla zabronionych nazw plików przysyłanych mod_core_pidfile=Zapisywać numer PID do pliku mod_core_epidfile=Nie podany lub niepoprawny plik z numerem PID mod_core_shell=Zezwalać na logowanie wyłącznie użytkowników o poprawnej powłoce mod_core_cpulimit=Ograniczenia wykorzystania CPU mod_core_ecpulimit=ograniczenie wykorzystania CPU mod_core_memlimit=Ograniczenia wykorzystania pamięci mod_core_ememlimit=ograniczenie wykorzystania pamięci mod_core_filelimit=Ograniczenia liczby otwartych plików mod_core_efilelimit=ograniczenie liczby otwartych plików mod_core_soft=Ograniczenie miękkie: mod_core_hard=Ograniczenie twarde: mod_core_max=Maksimum mod_core_esoft=Nie podane lub niepoprawne miękkie $1 mod_core_ehard=Nie podane lub niepoprawne twarde $1 mod_core_score=Ścieżka do katalogu scoreboard mod_core_escore=Nie podana lub niepoprawna ścieżka do katalogu scoreboard mod_core_admin=Adres e-mail administratora serwera mod_core_eadmin=Nie podany lub niepoprawny adres e-mail mod_core_identmsg=Komunikat o połączeniu się klienta mod_core_identmsg_def=Pokazywać komunikat standardowy mod_core_links=Pokazywać dowiązania symboliczne? mod_core_tight=Otwierać tylko niezbędne porty? mod_core_facility=Kategoria logowania systemowego mod_core_level=Poziom logowania systemowego mod_core_backlog=Długość kolejki TCP mod_core_ebacklog=Nie podana lub nie poprawna długość kolejki mod_core_nodelay=Używać opcji TCP_NODELAY dla gniazd? mod_core_rwindow=Rozmiar okna odbiorczego TCP mod_core_erwindow=Nie podany lub niepoprawny rozmiar okna odbiorczego mod_core_swindow==Rozmiar okna nadawczego TCP mod_core_eswindow=Nie podany lub niepoprawny rozmiar okna nadawczego mod_core_gmt=Pokazywać czas GMT? mod_core_tidle=Czas bezczynności przed rozłączeniem mod_core_etidle=Nie podany lub niepoprawny czas bezczynności mod_core_secs=sekund mod_core_tlogin=Czas oczekiwania na autoryzację mod_core_etlogin=Nie podany lub niepoprawny czas oczekiwania na autoryzację mod_core_ttransfer=Czas oczekiwania na pierwszy transfer mod_core_ettransfer=Nie podany lub niepoprawny czas oczekiwania na pierwszy transfer mod_core_tstalled=Czas oczekiwania na zablokowane transfery danych mod_core_etstalled=Nie podany lub niepoprawny czas oczekiwania na zablokowane transfery mod_core_ftpusers=Blokować dostęp użytkowników z pliku /etc/ftpusers? mod_core_hostsallow=Plik dozwolonych hostów mod_core_ehostsallow=Plik dozwolonych hostów nie istnieje mod_core_hostsdeny=Plik zabronionych hostów mod_core_ehostsdeny=Plik zabronionych hostów nie istnieje mod_core_revdns=Wykonywać poszukiwania adresów klientów w odwrotnym DNS? mod_core_userdir=Chroot do podkatalogu o nazwie użytkownika? mod_core_ualias=Aliasy nazwy użytkownika mod_core_afrom=Nazwa logowania mod_core_ato=Rzeczywista nazwa użytkownika mod_core_eafrom=Niepoprawna nazwa logowania w aliasie mod_core_eato=Nie podana lub niepoprawna rzeczywista nazwa użytkownika w aliasie mod_core_uowner=Właściciel przysyłanych plików mod_core_euowner=Nie podany lub niepoprawny właściciel przysyłanych plików mod_core_userpassword=Hasła użytkownikaów zastępują mod_core_upname=Użytkownik Uniksa mod_core_uppass=Hasło mod_core_updef=Pozostaw niezmienione mod_core_eupname=Niepoprwana nazwa użytkownika Uniksa mod_core_wtmp=Zapisywać logowania w wtmp? mod_core_allow_deny=Zabronić dostępu mod_core_allowdeny=Najpierw zezwalać, potem zabraniać mod_core_denyallow=Najpierw zabraniać, potem zezwalać mod_core_allow=Zezwalać mod_core_deny=Zabraniać mod_core_mode_0=Wszystkim mod_core_mode_1=Nikomu mod_core_mode_2=Adresowi IP mod_core_mode_3=Sieci mod_core_mode_4=Hostowi o nazwie mod_core_cond=Warunek mod_core_action=Działanie mod_core_agroup=Zezwolić tylko grupom mod_core_auser=Zezwolić tylko użytkownikom mod_core_all=Wszystkim mod_core_dgroup=Zabronić tylko grupom mod_core_duser=Zabronić tylko użytkownikom mod_core_eip='$1' nie jest poprawnym adresem IP mod_core_enet='$1' nie jest poprawnym adresem sieci mod_core_ehost='$1' nie jest poprawną nazwą hosta mod_ls_fakegroup=Fikcyjna grupa przy przeglądaniu katalogów? mod_ls_fakeuser=Fikcyjny użytkownik przy przeglądaniu katalogów? mod_ls_fakemode=Fikcyjne prawa dostępu przy przeglądaniu katalogów? mod_ls_dotfiles=Pokazywać pliki zaczynające się od . przy przeglądaniu? mod_ls_ls=Dodatkowe opcje dla ls mod_ls_els=Nie podano dodatkowych opcji dla ls mod_auth_chdir=Początkowy katalog logowania mod_auth_echdir=Nie podany lub niepoprawny katalog początkowy mod_auth_chroot=Katalogi chroot mod_auth_dir=Katalog mod_auth_groups=Grupy Uniksa mod_auth_all=Wszystkie mod_auth_edir=Niepoprawny katalog chroot mod_auth_egroups=Nie podano grup Uniksa mod_auth_echroot=Nie podany lub niepoprawny katalog chroot mod_auth_login=Nie pytać o hasło, gdy logowanie jest zabronione? mod_auth_root=Zezwolić na logowanie roota? mod_site_chmod=Zezwolić na polecenie chmod? mod_unixpw_ufile=Alternatywny plik haseł Uniksa mod_unixpw_eufile=Nie podany lub niepoprawny plik haseł Uniksa mod_unixpw_gfile=Alternatywny plik grup Uniksa mod_unixpw_egfile=Nie podany lub niepoprawny plik grup Uniksa mod_unixpw_none=Brak mod_unixpw_pam=Zawsze korzystać z autoryzacji PAM? mod_unixpw_persist=Trzymać plik haseł ciągle otwarty? mod_log_syslog=Logować błędy do pliku mod_log_sysdef=Logu systemowego mod_log_esyslog=Nie podana lub niepoprawna nazwa pliku logu mod_log_extended=Indywidualne pliki logów mod_log_file=Plik logu mod_log_cmd=Dla poleceń FTP mod_log_nick=Format logowania mod_log_all=Wszystkich mod_log_ecmd=Nie podano poleceń FTP mod_log_enick=Nie podana lub niepoprawna nazwa formatu logowania mod_log_ecmdnick=Musisz podać format logowania gdy określasz logowane polecenia mod_log_nickname=Nazwa formatu mod_log_fmt=Wzorzec formatu mod_log_format=Indywidualne formaty logowania mod_log_enickname=Nie podana lub niepoprawna nazwa formatu mod_log_efmt=Nie podano wzorca formatu mod_pam_pam=Korzystać z autoryzacji PAM? mod_pam_config=Autoryzować za pomocą usługi PAM mod_pam_econfig=Nie podana lub niepoprawna usługa PAM mod_readme_display=Zawiadamiać użytkownika o plikach $quot;readme" wg wzorca mod_readme_none=Nie zawiadamiać mod_readme_edisplay=Nie podano wzorca dla plików "readme" start_err=Nie udało się uruchomić serwera FTP start_einetd=Nie można uruchamiać serwera jako demona, gdy jest w trybie inetd. ftpaccess_title=Opcje dla plików w katalogu ftpaccess_desc=Dodatkowe opcje dla katalogu można podawać w pliku (zazwyczaj o nazwie .ftpaccess) w danym katalogu. Opcje te dotyczą wszystkich plików w tym katalogi i w jego podkatalogach, o ile nie zostały przesłonięte przez inny plik opcji. ftpaccess_create=Utwórz plik opcji ftpaccess_find=Szukaj plików opcji ftpaccess_auto=Dla anonimowego ftpaccess_from=W głąb katalogu ftpaccess_return=listy plików opcji ftpusers_title=Użytkownicy nie dopuszczeni do FTP ftpusers_desc=Dla wymienionych poniżej użytkowników z pliku $1 będzie zablokowana możliwość logowania się jako użytkownik FTP, o ile włączono to w sekcji Autoryzacja ftpindex_title=Plik opcji dla katalogu ftpindex_delete=Usuń plik ftpindex_opts=Opcje dla katalogu ftpindex_edit=Zmień dyrektywy ftpindex_limit=Opcje dla polecenia ftpindex_addlimit=Dodaj opcje dla polecenia .. ftpindex_header2=$1 w $2 ftpindex_return=pliku opcji dla katalogu ftpindex_header=Dla $1 find_err=Nie znaleziono plików opcji find_eanon=Dla żadnego serwera wirtualnego nie ustawiono anonimowego FTP log_global=Zmieniono opcje ogólne $1 log_ftpusers=Zmieniono użytkowników FTP o zabronionym dostępie log_virtc=Utworzono serwer $1 log_virts=Przekonfigurowano serwer $1 log_virtd=Usunięto serwer $1 log_virtm=Ręcznie zmieniono serwer $1 log_virt=Zmieniono $1 w serwerze $2 log_dirc=Utworzono katalog $1 log_dirc_l=Utworzono katalog $1 serwera $2 log_dirs=Zmieniono katalog $1 log_dirs_l=Zmieniono katalog $1 serwera $2 log_dird=Usunięto katalog $1 log_dird_l=Usunięto katalog $1 z serwera $2 log_dirm=Ręcznie zmieniono katalog $1 log_dirm_l=Ręcznie zmieniono katalog $1 serwera $2 log_dir=Zmieniono $1 w katalogu $2 log_dir_l=Zmieniono $1 w katalogu $2 serwera $3 log_limitc=Utworzono opcje dla poleceń $1 log_limits=Przekonfigurowano opcje dla poleceń $1 log_limitd=Usunięto opcje dla poleceń $1 log_limitm=Ręcznie zmieniono plik opcji dla poleceń $1 log_limit=Zmieniono $1 w pliku opcji dla poleceń $2 log_ftpaccessc=Utworzono plik opcji $1 log_ftpaccessd=Usunięto plik opcji $1 log_ftpaccessm=Ręcznie zmieniono plik opcji $1 log_ftpaccess=Zmieniono $1 w pliku opcji $2 log_start=Uruchomiono proftpd log_apply=Zastosowano zmiany proftpd/lang/ca0100644000567100000120000003761207401421102013444 0ustar jcameronwheelindex_title=Servidor ProFTPD index_eproftpd=No s'ha trobat el servidor ProFTPD $1. Pot ser que no estigui instalˇlat, o bé que la configuració del mňdul sigui incorrecta. index_eproftpd2=No sembla que el programa $1 sigui el servidor ProFTPD. Pot ser que no estigui instalˇlat, o bé que la configuració del mňdul sigui incorrecta. index_eversion=La versió del servidor ProFTPD $1 no estŕ suportada per Webmin. Només estan suportades les versions 1.2 i posteriors. index_econf=El fitxer de configuració de ProFTPD $1 no existeix o no és vŕlid. Pot ser que la configuració del mňdul sigui incorrecta. index_apply=Aplica els Canvis index_applymsg=Fes clic sobre aquest botó per aplicar la configuració actual enviant un senyal SIGHUP al procés ProFTPD en execució. index_start=Engega el Servidor index_startmsg=Fes clic sobre aquest botó per engegar el servidor FTP amb la configuració actual. També pots fer que el servidor s'engegui automŕticament quan calgui amb el mňdul Serveis d'Internet. index_startmsg2=Fes clic sobre aquest botó per engegar el servidor FTP amb la configuració actual. També pots fer que el servidor s'engegui automŕticament quan calgui amb inetd o algun programa equivalent. index_return=menú principal index_virts=Servidors Virtuals index_virt=Servidors Virtuals index_type=Tipus de servidor index_addr=Adreces index_name=Nom del servidor index_port=Port FTP index_defserv=Servidor per defecte index_defdesc=gestiona qualsevol connexió FTP no gestionada pels servidors virtuals. index_any=Qualsevol index_vdesc=gestiona totes les connexions de $1 index_eip=<Desconegut> index_global=Configuració Global index_create=Crea un servidor virtual efailed=No he pogut desar $1 type_0=Opcions de xarxa type_1=Opcions de Registre type_2=Fitxers i Directoris type_3=Control d'Accés type_4=Miscelˇlŕnia type_5=Usuari i Grup type_6=Autenticació virt_title=Opcions del Servidor Virtual virt_header1=De $1 virt_header2=Del servidor per defecte virt_header3=opcions $1 virt_anon=FTP anňnim virt_header=Opcions per directori i per ordre virt_dir=Directori $1 virt_limit=Ordres $1 virt_adddir=Afegeix opcions per directori a... virt_addlimit=Afegeix opcions per ordre a... virt_path=Camí del directori virt_cmds=Ordres FTP virt_return=servidor virtual virt_virt=Configura Servidor Virtual virt_edit=Edita les Directives vserv_title=Configuració de Servidor Virtual vserv_addr=Adreça vserv_name=Nom del servidor vserv_port=Port FTP vserv_delete=Suprimeix el servidor virtual vserv_eaddr=Hi falta l'adreça o bé és invŕlida vserv_eport=Hi falta el número del port o bé és invŕlid vserv_ename=Hi falta el nom del servidor anon_title=Opcions de FTP Anňnim anon_header1=Del servidor virtual $1 anon_header2=Del servidor per defecte anon_anon=Configura FTP Anňnim anon_return=opcions de FTP anňnim anon_header3=Del FTP anňnim del servidor virtual $1 anon_header4=Del FTP anňnim del servidor per defecte aserv_title=Configuració del FTP Anňnim aserv_create=Configura el FTP Anňnim aserv_root=Directori chroot aserv_user=Accedeix els fitxers com a usuari aserv_group=Accedeix els fitxers com a grup aserv_err=No he pogut desar el FTP anňnim aserv_eroot=Hi falta el directori chroot o bé és invŕlid aserv_euser=Hi falta l'usuari Unix o bé és invŕlid aserv_egroup=Hi falta el grup Unix o bé és invŕlid aserv_desc=Encara no s'ha configurat l'FTP anňnim d'aquest servidor virtual. Fes servir aquest formulari per configurar les opcions inicials. dir_title=Opcions per Directori dir_header2=Del directori $1 del servidor per defecte dir_header1=Del directori $1 del servidor virtual $2 dir_edit=Edita les Directives dir_return=opcions per directori dir_header3=opcions $1 de $2 dir_header=Opcions per ordre dir_dir=Configura el Directori dir_header4=Del directori $1 de l'FTP anňnim manual_title=Edició de Directives manual_header=Fes servir la caixa de text de sota per editar manualment les directives ProFTPD de $1 que s'apliquen a aquest servidor virtual, directori o ordres. limit_title=Opcions per Ordre limit_header4=De les ordres $1 del directori $2 limit_header2=De les ordres $1 del servidor per defecte limit_header1=De les ordres $1 del servidor virtual $2 limit_edit=Edita les Directives limit_limit=Configura les Ordres limit_header3=opcions $1 de les ordres $2 limit_return=opcions per ordre limit_header5=de les ordres $1 de l'FTP anňnim lserv_title=Configuració d'Ordres lserv_cmd=Ordres FTP lserv_delete=Suprimeix la configuració del les ordres lserv_err=No he pogut desar les ordres lserv_ecmd=No has seleccionat cap ordre dserv_title=Configuració de Directori dserv_dir=Camí del directori dserv_err=No he pogut desar el directori dserv_edir=Hi falta el camí del directori dserv_delete=Suprimeix la configuració del directori mod_core_type=Tipus de servidor mod_core_inetd=Executa'l des d'Inetd mod_core_stand=Dimoni independent mod_core_port=Escolta el port mod_core_eport=Hi falta el número del port o bé és invŕlid mod_core_servername=Nom del servidor mostrat als usuaris mod_core_eservername=Hi falta el nom del servidor mod_core_defaultserver=Fes servir aquest servidor virtual per defecte mod_core_instances=Nombre mŕxim de sessions concurrent mod_core_einstances=Hi falta el nombre de sessions o bé és invŕlid mod_core_umask=Umask nova mod_core_eumask=Hi falta l'umask o bé és invŕlida mod_core_user=Executa com a usuari Unix mod_core_uname=Nom de l'usuari mod_core_uid=UID mod_core_group=Executa com a grup Unix mod_core_gname=Nom del grup mod_core_gid=GID mod_core_tlog=Fitxer de registre de transferčncies FTP mod_core_etlog=Hi falta el fitxer de registres o bé és invŕlid mod_core_accessdeny=Missatge de login fallat mod_core_accessgrant=Missatge de login reeixit mod_core_adall=Política de control d'accés mod_core_addefault=Igual que el pare mod_core_allowall=Permet tots els clients mod_core_denyall=Denega tots els clients mod_core_filter=Permet expressions regulars en ordres FTP mod_core_foreign=Permet transferčncies de dades externes mod_core_overwrite=Permet la reescriptura de fitxers mod_core_restart=Permet el reinici de descŕrregues mod_core_restart2=Permet cŕrregues reiniciades mod_core_require=Exigeix contrasenya per FTP anňnim mod_core_anongroup=Grups els membres dels quals cal tractar com a usuari anňnim mod_core_eanongroup=No has introduďt cap grup anňnim mod_core_authalias=Permet l'entrada només als usuaris amb ŕlies mod_core_authusingalias=Fes servir la contrasenya de l'ŕlies per l'entrada anňnima mod_core_bind=Lliga a l'adreça mod_core_bind_all=Totes les adreces mod_core_ebind=Hi falta el lligam d'adreça o bé és invŕlid mod_core_cdpath=Curtcircuita els directoris CD mod_core_classes=Activa les classes per al control d'accés mod_core_cls=Classes de control d'accés mod_core_cname=Nom de la classe mod_core_ctype=Tipus i valor mod_core_climit=Connexions mŕximes mod_core_cregex=Patró de coincidčncia del nom de host client mod_core_cip=Xarxa IP client/CIDR mod_core_eclimit=Hi falta el nombre mŕxim de connexions o bé és invŕlid mod_core_ecregex=Hi falta el patró del nom de host client mod_core_ecip=Hi falta la Xarxa IP client/CIDR mod_core_buffer=Llargŕria mŕxima de l'ordre FTP mod_core_ebuffer=Hi falta la llargŕria mŕxima de l'ordre FTP o bé és invŕlida mod_core_transfer=Mode de transferčncia per defecte mod_core_binary=Binari mod_core_ascii=ASCII mod_core_defer=Difereix els missatges de benvinguda fins després d'haver entrat mod_core_aborted=Suprimeix les cŕrregues avortades mod_core_dfilter=Expressions regulars d'ordres FTP denegades mod_core_display=Fitxer de missatge previ a l'entrada mod_core_none=Cap mod_core_edisplay=Hi falta el fitxer de missatge previ a l'entrada mod_core_firstcd=Nom del fitxer README del directori mod_core_efirstcd=Hi falta el nom del fitxer README del directori mod_core_goaway=Fitxer de missatge de connexions excessives mod_core_egoaway=Hi falta el fitxer de missatge de connexions excessives mod_core_login=Fitxer de missatge posterior a l'entrada mod_core_elogin=Hi falta el fitxer de missatge posterior a l'entrada mod_core_quit=Fitxer de missatge de sortida mod_core_equit=Hi falta el fitxer de missatge de sortida mod_core_gowner=Grup propietari dels fitxers pujats mod_core_egowner=Hi falta el grup propietari dels fitxers pujats mod_core_grouppassword=Contrasenyes de grups mod_core_gpname=Unix grup mod_core_gppass=Contrasenya mod_core_gpdef=Deixa-ho tal com estŕ mod_core_egpname=Nom de grup Unix invŕlid mod_core_hstor=Amaga els fitxers pujats mod_core_hgroup=Amaga els fitxers propietat dels grups mod_core_ehgroup=Nom de grup invŕlid mod_core_hnoaccess=Amaga els fitxers que no puguin ser accedits mod_core_huser=Amaga els fitxers propietat dels usuaris mod_core_ehuser=Nom d'usuari invŕlid mod_core_ident=Consulta la identitat remota del nom d'usuari mod_core_ihidden=Fes que els fitxers amagats siguin inaccessibles mod_core_masq=Mascarada com a adreça mod_core_masq_def=Fes servir l'adreça real mod_core_emasq=Hi falta l'adreça de mascarada o bé és invŕlida mod_core_maxc=Mŕxim nombre d'usuaris concurrents mod_core_maxc1=Ilˇlimitat mod_core_maxcmsg=Missatge d'error d'entrada mod_core_emaxc=Hi falta el nombre mŕxim d'usuaris concurrents o bé és invŕlid mod_core_maxch=Mŕxim nombre d'usuaris concurrents per host mod_core_maxcu=Mŕxim nombre d'entrades concurrents per usuari mod_core_logins=Mŕxim nombre d'entrades fallades per sessió mod_core_elogins=Hi falta el nombre d'entrades fallades o bé és invŕlid mod_core_rfc2228=Envia respostes estil RFC2228 mod_core_pasv=Rang del port PASV mod_core_pasvr=Mín - mŕx mod_core_epasv=Hi falta el número del port PASV o bé és invŕlid mod_core_pathallow=Expressió regular de fitxers pujats permesos mod_core_any=Qualsevol mod_core_pathdeny=Expressió regular de fitxers pujats denegats mod_core_pidfile=Escriu el PID al fitxer mod_core_epidfile=Hi falta el fitxer de PID o bé és invŕlid mod_core_shell=Permet només l'entrada d'usuaris amb shell vŕlida mod_core_cpulimit=Límits de recursos de la CPU mod_core_ecpulimit=Límits de recursos de la CPU mod_core_memlimit=Límits de recursos de memňria mod_core_ememlimit=límit de recursos de memňria mod_core_filelimit=Límits de fitxers oberts mod_core_efilelimit=límit de fitxers oberts mod_core_soft=Límit del programari: mod_core_hard=Límit del maquinari: mod_core_max=Mŕxim mod_core_esoft=Hi falta el $1 del programari o bé és invŕlid mod_core_ehard=Hi falta el $1 del maquinari o bé és invŕlid mod_core_score=Camí del directori de puntuacions mod_core_escore=Hi falta el directori de puntuacions o bé és invŕlid mod_core_admin=Adreça de correu de l'administrador del servidor mod_core_eadmin=Hi falta l'adreça de correu o bé és invŕlida mod_core_ident=Missatge de connexió del client mod_core_ident_def=Mostra el missatge per defecte mod_core_links=Mostra els enllaços simbňlics mod_core_tight=Lliga només els ports necessaris mod_core_facility=Utilitat de registres del sistema mod_core_level=Nivell de registres del sistema mod_core_backlog=Llargŕria de la cua TCP backlog mod_core_ebacklog=Hi falta la llargŕria de la cua backlog o bé és invŕlida mod_core_nodelay=Fes servir l'opció de sňcol TCP_NODELAY mod_core_rwindow=Mida de la finestra de recepció TCP mod_core_erwindow=Hi falta la mida de la finestra de recepció o bé és invŕlida mod_core_swindow=Mida de la finestra de tramesa TCP mod_core_eswindow=Hi falta la mida de la finestra de tramesa o bé és invŕlida mod_core_gmt=Mostra l'hora GMT mod_core_tidle=Temps d'inacció abans de desconnectar mod_core_etidle=Hi falta el temps d'inacció o bé és invŕlid mod_core_secs=segons mod_core_tlogin=Temps d'espera de l'autenticació mod_core_etlogin=Hi falta el temps d'espera de l'autenticació o bé és invŕlid mod_core_ttransfer=Temps d'espera de la primera transferčncia mod_core_ettransfer=Hi falta el temps d'espera de la primera transferčncia o bé és invŕlid mod_core_tstalled=Temps d'espera de les transferčncies de dades aturades mod_core_etstalled=Hi falta el temps d'espera de les transferčncies de dades aturades o bé és invŕlid mod_core_ftpusers=Denega els usuaris del fitxer /etc/ftpusers mod_core_hostsallow=Fitxer de hosts permesos mod_core_ehostsallow=El fitxer de hosts permesos no existeix mod_core_hostsdeny=Fitxer de hosts denegats mod_core_ehostsdeny=El fitxer de hosts denegats no existeix mod_core_revdns=Fes consultes inverses de les adreces client mod_core_userdir=Fes chroot al subdirectori de l'usuari mod_core_ualias=Ŕlies d'usuari mod_core_afrom=Nom d'usuari mod_core_ato=Nom real de l'usuari mod_core_eafrom=Nom d'usuari invŕlid a l'ŕlies mod_core_eato=Hi falta el nom d'usuari real o bé és invŕlid mod_core_uowner=Propietari dels fitxers pujats mod_core_euowner=Hi falta el propietari dels fitxers pujats o bé és invŕlid mod_core_userpassword=Ignorŕncia de les contrasenyes d'usuaris mod_core_upname=Usuari Unix mod_core_uppass=Contrasenya mod_core_updef=Deixa-ho tal com estŕ mod_core_eupname=Usuari Unix invŕlid mod_core_wtmp=Enregistra les entrades a wtmp mod_core_allow_deny=Restringeix l'accés mod_core_allowdeny=Permet-lo i denega'l després mod_core_denyallow=Denega'l i permet-lo després mod_core_allow=Permet mod_core_deny=Denega mod_core_mode_0=Tots mod_core_mode_1=Cap mod_core_mode_2=Adreça IP mod_core_mode_3=Xarxa mod_core_mode_4=Nom de host mod_core_cond=Condició mod_core_action=Acció mod_core_agroup=Permet només els grups mod_core_auser=Permet només els usuaris mod_core_all=Tots mod_core_dgroup=Denega els grups mod_core_duser=Denega els usuaris mod_core_eip='$1' no és una adreça IP vŕlida mod_core_enet='$1' no és una adreça de xarxa vŕlida mod_core_ehost='$1' no és un nom de host vŕlid mod_ls_fakegroup=Simula el grup en els llistats de directori mod_ls_fakeuser=Simula l'usuari en els llistats de directori mod_ls_fakemode=Simula els permisos en els llistats de directori mod_ls_dotfiles=Mostra el fitxers que comencen per . en els llistats de directori mod_ls_ls=Opcions addicionals de ls mod_ls_els=Hi falten les opcions addicionals de ls mod_auth_chdir=Directori d'entrada inicial mod_auth_echdir=Hi falta el directori d'entrada inicial o bé és invŕlid mod_auth_chroot=Directoris chroot mod_auth_dir=Directori mod_auth_groups=Grups Unix mod_auth_all=Tothom mod_auth_edir=Directori chroot invŕlid mod_auth_egroups=No has introduďt cap grup Unix per a chroot mod_auth_echroot=Hi falta el directori chroot o bé és invŕlid mod_auth_login=No demanis la contrasenya si l'entrada estŕ denegada mod_auth_root=Permet l'entrada de root mod_site_chmod=Permet l'ordre chmod mod_unixpw_ufile=Fitxer alternatiu de contrasenyes Unix mod_unixpw_eufile=Hi falta el fitxer alternatiu de contrasenyes o bé és invŕlid mod_unixpw_gfile=Fitxer alternatiu de grups Unix mod_unixpw_egfile=Hi falta el fitxer alternatiu de grups o bé és invŕlid mod_unixpw_none=Cap mod_unixpw_pam=Tracta sempre els PAM com a autoritatius mod_unixpw_persist=Mantingues el fitxer de contrasenyes permanentment obert mod_log_syslog=Enregistra els errors al fitxer mod_log_sysdef=Registre del sistema mod_log_esyslog=Hi falta el fitxer de registre o bé és invŕlid mod_log_extended=Fitxers de registre personalitzats mod_log_file=Fitxer de registre mod_log_cmd=De les ordres FTP mod_log_nick=Format del registre mod_log_all=Totes mod_log_ecmd=Hi falten les ordres FTP mod_log_enick=Hi falta el nom del format o bé és invŕlid mod_log_ecmdnick=Quan especifiques ordres per registrar, has d'introduir un format de registre mod_log_nickname=Nom del format mod_log_fmt=Cadena de format mod_log_format=Formats de registre personalitzats mod_log_enickname=Hi falta el nom del format o bé és invŕlid mod_log_efmt=Hi falta la cadena de format mod_pam_pam=Fes servir PAM per a l'autenticació mod_pam_config=Autentica fent servir el servei PAM mod_pam_econfig=Hi falta el servei PAM o bé és invŕlid mod_readme_display=Avisa a l'usuari dels fitxers readme que coincideixin amb mod_readme_none=Cap mod_readme_edisplay=Hi falta el patró dels fitxers readme start_err=No he pogut engegar el servidor FTP start_einetd=No pots engegar el dimoni servidor en mode inetd. proftpd/lang/es0100664000567100000120000004144107401421102013465 0ustar jcameronwheelindex_title=Servidor ProFTPD index_eproftpd=El servidor ProFTPD $1 no ha sido encontrado en tu sistema. O no está instalado, o tu modulo de configuracion es incorrecto. index_eproftpd2=El programa $1 no parece ser el servidor ProFTPD. O no está instalado, o tu modulo de configuracion es incorrecto. index_eversion=La versión del servidor ProFTPD $1 Webmin no la maneja. Sólo versiones 1.2 y superiores son soportadas. index_econf=El archivo de configuración de ProFTPD $1 quizás no exista o no sea válido. O no está instalado, o tu modulo de configuracion es incorrecto. index_apply=Aplicar Cambios index_applymsg=Haz click en este botón para aplicar la nueva configuración enviando una seńal SIGHUP al servidor ProFTPD en proceso. index_start=Arrancar el servidor index_startmsg=Haz click en este botón para iniciar el servidor FTP con la nueva configuración. También puedes configurar el servidor para ser iniciado automáticamente cuando se necesite, usando el modulo Servicios Internet. index_startmsg2=Haz click en este botón para iniciar el servidor FTP con la nueva configuración. También puedes configurar el servidor para ser iniciado automáticamente cuando se necesite, usando inetd o algún programa equivalente. index_return=Menú principal index_virts=Servidores Virtuales index_virt=Servidor Virtual index_type=Tipo de servidor index_addr=Dirección index_name=Nombre del servidor index_port=Puerto FTP index_defserv=Servidor por defecto index_defdesc=Maneja cualquier conexión FTP no manejadas por los servidores virtuales. index_any=Cualquiera index_vdesc=Maneja todas las conexiones a $1 index_eip=<Desconocido> index_global=Configuración global index_create=Crear servidor virtual efailed=Falló al guardar $1 type_0=Opciones de Red type_1=Opciones de Acceso type_2=Archivos y Directorios type_3=Control de Acceso type_4=Varios... type_5=Usuario y grupo type_6=Autenticación virt_title=Opciones de Servidor Virtual virt_header1=Para $1 virt_header2=Para servidor por defecto virt_header3=$1 opciones virt_anon=FTP anónimo virt_header=Opciones Por-directorio y Por-comandos virt_dir=Directorio $1 virt_limit=Comandos $1 virt_adddir=Ańadir opciones por-directorio para ... virt_addlimit=Ańadir opciones por-comando para ... virt_path=Ruta de directorio virt_cmds=Comandos FTP virt_return=Servidor virtual virt_virt=Configurar Servidor Virtual virt_edit=Editar Directivas vserv_title=Configurar Servidor Virtual vserv_addr=Dirección vserv_name=Nombre del servidor vserv_port=Puerto FTP vserv_delete=Borrar Servidor Virtual vserv_eaddr=Dirección perdida o incorrecta vserv_eport=Número de puerto perdido o incorrecto vserv_ename=Perdido nombre de servidor anon_title=Opciones de FTP anónimo anon_header1=En servidor virtual $1 anon_header2=En servidor por defecto anon_anon=Configuración de FTP anónimo anon_return=Opciones de FTP anónimo anon_header3=Para FTP anónimo en servidor virtual $1 anon_header4=Para FTP anónimo en servidor por defecto aserv_title=Configurar FTP anónimo aserv_create=Organizar FTP anónimo aserv_root=Directorio chroot aserv_user=Archivos de acceso como usuario aserv_group=archivos de acceso como grupo aserv_err=Error al guardar FTP anónimo aserv_eroot=Directorio chroot inexistente o no válido aserv_euser=Usuario inexistente o no válido aserv_egroup=Grupo unix group inexistente o no válido aserv_desc=FTP anónimo no ha sido configurado todavía en este servidor virtual. Usa esta formulario para poner las opciones iniciales de la configuración. dir_title=Opciones Por-Directorio dir_header2=Por-Directorio $1 en servidor por defecto dir_header1=Por-Directorio $1 en servidor virtual $2 dir_edit=Editar Directivas dir_return=opciones por-directorio dir_header3=$1 opciones en $2 dir_header=Opciones Por-comando dir_dir=Configurar Directorio dir_header4=Por-Directorio $1 en FTP anónimo manual_title=Editar Directivas manual_header=Usa la caja del texto inferior para revisar las directivas de ProFTPD en $1 esto se aplicará a este servidor virtual, directorio o comandos. limit_title=Opciones Por-comandos limit_header4=Para comandos $1 en directorio $2 limit_header2=Para comandos $1 en servidor por defecto limit_header1=Para comandos $1 en servidor virtual $2 limit_edit=Editar Directivas limit_limit=Configurar Comandos limit_header3=$1 opciones para comandos $2 limit_return=opciones por-comando limit_header5=Para comandos $1 en FTP anónimo limit_header6=Para comandos $1 en archivo $2 lserv_title=Configuracion de Comandos lserv_cmd=Comandos FTP lserv_delete=Borrar configuración de comandos lserv_err=Error al guardar comandos lserv_ecmd=No hay comandos seleccionados dserv_title=Configuración de directorio dserv_dir=Ruta de Directorio dserv_err=Error al guardar directorio dserv_edir=Ruta de Directorio perdida o inexistente dserv_delete=Borrar configuración de directorio mod_core_type=Tipo de Servidor mod_core_inetd=Funcionar desde Inetd mod_core_stand=Funcionar como demonio permanente (Stand-alone) mod_core_port=Escuchar en puerto mod_core_eport=Número de puerto perdido o no válido mod_core_servername=Nombre de servidor mostrado a los usuarios mod_core_eservername=Nombre de servidor perdido o inexistente mod_core_defaultserver=żUsar este servidor virtual por defecto? mod_core_instances=Número máximo de sesiones concurrentes mod_core_einstances=Número de sesiones perdido o no válido mod_core_umask=Nuevo archivo umask mod_core_eumask=Archivo umask perdido o no válido mod_core_user=Funcionar como usuario Unix mod_core_uname=Nombre de usuario mod_core_uid=UID mod_core_group=Funcionar como grupo Unix mod_core_gname=Nombre de grupo mod_core_gid=GID mod_core_tlog=Archivo log de tranferencias FTP mod_core_etlog=Archivo log de tranferencias FTP perdido o no válido mod_core_accessdeny=Mensaje de error en login mod_core_accessgrant=Mensaje acceso en login mod_core_adall=Politica de control de acceso mod_core_addefault=Igual que el padre mod_core_allowall=Permitir todos los clientes mod_core_denyall=Denegar todos los clientes mod_core_filter=Comandos FTP permitidos regexp mod_core_foreign=żPermitir las transmisiones de datos externas? mod_core_overwrite=żPermitir sobreescribir los archivos? mod_core_restart=żPermitir arrancar de nuevo las descargas (download)? mod_core_restart2=żPermitir arrancar de nuevo las cargas (upload)? mod_core_require=żSolicitar password para login anónimo? mod_core_anongroup=Tratar miembros de grupos como anónimos mod_core_eanongroup=No has introducido grupo anónimo mod_core_authalias=żPermitir login sólo a usuarios con alias? mod_core_authusingalias=żUsar como password el alias para login anónimo? mod_core_bind=Unir a la dirección mod_core_bind_all=Todas las direcciones mod_core_ebind=Dirección para unir perdida o no válida mod_core_cdpath=Enlace a directorio de CD mod_core_classes=żActiva clases para control de acceso? mod_core_cls=Control de acceso por clases mod_core_cname=Nombre de clase mod_core_ctype=Tipo y valor mod_core_climit=Max conexiones mod_core_cregex=Cliente coincide con nombre de host mod_core_cip=IP de cliente red/CIDR mod_core_eclimit=Max conexiones perdidas o no válidas mod_core_ecregex=Coincidencia cliente/nombre de host perdida o no válida mod_core_ecip=IP de cliente red/CIDR perdida o no válida mod_core_buffer=Longitud máxima de comandos FTP mod_core_ebuffer=Longitud máxima de comandos FTP perdida o no válida mod_core_transfer=Modo de transferencia por defecto mod_core_binary=Binario mod_core_ascii=ASCII mod_core_defer=żAplazar el mensaje bienvenida hasta después del login? mod_core_aborted=żborrado de las cargas (upload) anuladas? mod_core_dfilter=Comanfos FTP regexp denegados mod_core_display=Archivo de mensaje Pre-login mod_core_none=Ninguno mod_core_edisplay=Archivo de mensaje Pre-login perdido o no válido mod_core_firstcd=Directorio del archivo README mod_core_efirstcd=Directorio del archivo README perdido o no válido mod_core_goaway=Archivo de mensaje de exceso de conexiones mod_core_egoaway=Archivo de mensaje de exceso de conexiones perdido o no válido mod_core_login=Archivo de mensaje de Post-login mod_core_elogin=Archivo de mensaje de Post-login perdido o no válido mod_core_quit=Archivo de mensaje de salida de login mod_core_equit=Archivo de mensaje de salida de login perdido o no válido mod_core_gowner=Grupo propietario de los archivos cargados (upload) mod_core_egowner=Grupo propietario de los archivos cargados (upload) perdido o no válido mod_core_grouppassword=Passwords de grupo mod_core_gpname=Grupo Unix mod_core_gppass=Password mod_core_gpdef=No cambiar nada mod_core_egpname=Nombre de grupo Unix no válido mod_core_hstor=żOcultar los archivos cargados? mod_core_hgroup=Oculta archivos de los grupos mod_core_ehgroup=Nombre de grupo para ocultar archivos no válido mod_core_hnoaccess=żOculta archivos para que no pueden accederse? mod_core_huser=Ocultar archivos de los usuarios mod_core_ehuser=Nombre de usuario para ocultar archivos no válido mod_core_ident=żComprobar el nombre de usuario en la identidad remota? mod_core_ihidden=żHacer inaccesibles los archivos ocultos? mod_core_masq=Enmascarar como la dirección mod_core_masq_def=Usar dirección real mod_core_emasq=Dirección de enmascaramiento perdido o no válido mod_core_maxc=Máximos logins concurrentes mod_core_maxc1=Ilimitado mod_core_maxcmsg=Mensaje de error en login mod_core_emaxc=Número de máximos logins perdido o no válido mod_core_maxch=Máximos logins concurrentes por host mod_core_maxcu=Máximos logins concurrentes por usuario mod_core_logins=Máximos errores de logins por sesión mod_core_elogins=Número de error de login perdido o no válido mod_core_rfc2228=żEnviar respuestas en formato RFC2228? mod_core_pasv=Rango de puetos PASV mod_core_pasvr=Min - max mod_core_epasv=Número de puetos PASV perdido o no válido mod_core_pathallow=Nombre de archivo permitido cargar regex mod_core_any=Cualquiera mod_core_pathdeny=Nombres de archivos con carga denegada regex mod_core_pidfile=Escribir PID en archivo mod_core_epidfile=Archivo PID perdido o no válido mod_core_shell=żSólo permitir login de usuarios con Shell válida? mod_core_cpulimit=Límite de recursos CPU mod_core_ecpulimit=Límite de recursos CPU mod_core_memlimit=Límite de recursos Memoria mod_core_ememlimit=Límite de recursos memoria mod_core_filelimit=Límite de archivos abiertos mod_core_efilelimit=Límite de archivos abiertos mod_core_soft=Límite de software: mod_core_hard=Límite de hardware: mod_core_max=Máximo mod_core_esoft=Soft $1 perdido o no válido mod_core_ehard=Hard $1 perdido o no válido mod_core_score=Ruta al directorio del marcador mod_core_escore=Directorio del marcador perdido o no válido mod_core_admin=Dirección de correo-e del administrador del servidor mod_core_eadmin=Dirección de correo-e perdida o no válida mod_core_ident=Mensaje de conexión de cliente mod_core_ident_def=Mostrar mensaje por defecto mod_core_links=żMostrar enlaces simbolicos? mod_core_tight=żSólo conectar los puertos necesitados? mod_core_facility=Sistema, activación de log mod_core_level=Sistema, nivel de log mod_core_backlog=Longitud de cola de atrasos TCP mod_core_ebacklog=Longitud de cola de atrasos TCP perdida o no válida mod_core_nodelay=żUsar opción socket TCP_NODELAY? mod_core_rwindow=Tamańo de la ventana de recepción TCP mod_core_erwindow=Tamańo de la ventana de recepción TCP perdido o no válido mod_core_swindow=Tamańo de la ventana de envío TCP mod_core_eswindow=Tamańo de la ventana de envio TCP perdido o no válido mod_core_gmt=żMostrar tiempo en formato GMT? mod_core_tidle=Tiempo de espera antes de desconectar mod_core_etidle=Tiempo de espera perdido o no válido mod_core_secs=segundos mod_core_tlogin=Tiempo de espera para autenticación mod_core_etlogin=Tiempo de autenticación perdido o no válido mod_core_ttransfer=Tiempo de espera para primer envío mod_core_ettransfer=Tiempo de primer envío perdido o no válido mod_core_tstalled=Tiempo de esperar para la transmisión del datos atascada mod_core_etstalled=Tiempo de la transmisión del datos atascada perdido o no válido mod_core_ftpusers=żRechazar usuarios en /etc/ftpusers? mod_core_hostsallow=Archivo de host a permitir mod_core_ehostsallow=Archivo de host a permitir no existe mod_core_hostsdeny=Archivo de host a denegar mod_core_ehostsdeny=Archivo de host a denegar no existe mod_core_revdns=żInvertir las direcciones DNS del cliente? mod_core_userdir=żSubdirectorio Chroot de usuario? mod_core_ualias=Alias de usuario mod_core_afrom=Nombre de usuario en login mod_core_ato=Nombre real de usuario mod_core_eafrom=Alias de usuario no válido para login mod_core_eato=Nombre real de usuario en alias perdido o no válido mod_core_uowner=Propietario de los archivos cargados mod_core_euowner=Propietario de los archivos cargados perdido o no válido mod_core_userpassword=Sustituir las contraseńas de usuario mod_core_upname=Usuario Unix mod_core_uppass=Password mod_core_updef=No cambiar nada mod_core_eupname=Nombre de usuario Unix no válido mod_core_wtmp=Guardar logins en wtmp? mod_core_allow_deny=Restringir acceso mod_core_allowdeny=Permite luego deniega mod_core_denyallow=Deniega luego permite mod_core_allow=Permite mod_core_deny=Deniega mod_core_mode_0=Todos mod_core_mode_1=Ninguno mod_core_mode_2=Dirección IP mod_core_mode_3=Red mod_core_mode_4=Nombre de Host mod_core_cond=Condición mod_core_action=Acción mod_core_agroup=Sólo permite grupos mod_core_auser=Sólo permite usuarios mod_core_all=Todos mod_core_dgroup=Deniega grupos mod_core_duser=Deniega usuarios mod_core_eip='$1' no es una dirección IP váliada mod_core_enet='$1' no es una dirección de Red válida mod_core_ehost='$1' no es un nombre de Host válido mod_ls_fakegroup=Falsos grupos en lista de directorio? mod_ls_fakeuser=Falsos usuarios en lista de directorio? mod_ls_fakemode=Falsos permisos en lista de directorio? mod_ls_dotfiles=Mostrar archivos que empiezan por . en listados? mod_ls_ls=Opciones ls adicionales mod_ls_els=Opciones ls adicionales perdidas mod_auth_chdir=Directorio inicial mod_auth_echdir=Directorio inicial perdido o no válido mod_auth_chroot=Directorio chroot mod_auth_dir=Directorio mod_auth_groups=Grupos Unix mod_auth_all=Todos mod_auth_edir=Directorio chroot no válido mod_auth_egroups=No se han introducido grupos unix para chroot mod_auth_echroot=Directorio chroot perdido o no válido mod_auth_login=żNo pedir password si el acceso ha sido denegado? mod_auth_root=żPermitir el acceso a root? mod_site_chmod=żPermitir comandos chmod? mod_unixpw_ufile=Archivo alternativo de password de usuario mod_unixpw_eufile=Archivo Unix de password de usuario perdido o no válido mod_unixpw_gfile=Archivo alternativo de password de grupo mod_unixpw_egfile=Archivo Unix de password de grupo perdido o no válido mod_unixpw_none=Ninguno mod_unixpw_pam=żSiempre tratar PAM como Autoritativo? mod_unixpw_persist=żMantener el archivo de passwords abierto permanentemente? mod_log_syslog=Guardar errores en archivo mod_log_sysdef=Archivo de sistema mod_log_esyslog=Archivo de log desaparecido o inservible mod_log_extended=Archivos de log personalizados mod_log_file=Archivo de log mod_log_cmd=Para comandos FTP mod_log_nick=Formato de log mod_log_all=Todo mod_log_ecmd=Comandos FTP desaparecidos mod_log_enick=Nombre de formato de log perdido o no válido mod_log_ecmdnick=Has de introducir un formato de log cuando especificas comandos para log mod_log_nickname=Nombre de formato mod_log_fmt=Cadena de formato mod_log_format=Formato de log personalizado mod_log_enickname=Nombre de formato perdido o no válido mod_log_efmt=Cadena de formato desaparecido mod_pam_pam=żUsas PAM para la autenticación? mod_pam_config=Autenticación usando PAM mod_pam_econfig=PAM no activo o desaparecido mod_readme_display=Notifica al usuario que los archivos leeme coinciden mod_readme_none=Ninguno mod_readme_edisplay=Perdida configuración de ficheros de leeme start_err=Error al iniciar el servidor FTP start_einetd=No puedes arrancar el servidor FTP en modo inetd. ftpaccess_title=Archivos de opciones Por-Directorio ftpaccess_desc=Pueden especificarse las opciones del por-directorio adicionales en un archivo (normalmente llamado .ftpaccess) en cada directorio. Las opciones se aplican a todos los archivos en ese directorio y cualquier sub-directorio, a menos que sea sustituido por otro archivo de opciones. ftpaccess_create=Crear Archivo de opciones ftpaccess_find=Buscar Archivo de opciones ftpaccess_auto=Como Anónimo ftpaccess_from=Desde directorio ftpaccess_return=Lista de archivos de opciones ftpusers_title=Usuarios FTP denegados ftpusers_desc=Si se habilitó la Autenticación, se denegará el login FTP a los usuarios listados en el archivo $1. ftpindex_title=Archivos de opciones Por-Directorio ftpindex_delete=Borrar archivo ftpindex_opts=Opciones Por-Directorio ftpindex_edit=Editar Directivas ftpindex_limit=Opciones Por-comando ftpindex_addlimit=Ańadir opciones por-comando para ... ftpindex_header2=$1 en $2 ftpindex_return=Archivo de opciones por-directorio ftpindex_header=Para $1 find_err=No se encontraron archivos de opciones find_eanon=FTP anónimo no está configurado en ningún servidor virtualproftpd/images/0040755000567100000120000000000007401421102013454 5ustar jcameronwheelproftpd/images/icon.gif0100664000567100000120000000301307401421102015067 0ustar jcameronwheelGIF89a00÷ýýţţţţţţţţţţţ ţ ţ ţ ţţţţţţţţţţ ţ$$ţ%%ţ''ţ((ţ))ţ,,ţ--ţ..ţ22ţ55ţ66ţ::ţ;;ţ==ţ>>ţ??ţAAţEEţHHţMMţOOţPPţRRţSSţUUţXXţZZţ]]ţ__ţ``ţccţddţeeţffţiiţmmţnnţooţppţrrţssţvvţzzţ||ţ~~ţţţ‚‚ţ††ţ‰‰ţŠŠţŽŽţ’’ţ““ţ••ţœœţţ˘˘ţ§§ţŠŠţŞŞţ°°ţąąţśśţˇˇţ¸¸ţššţťťţźźţ˝˝ţžžţżżţŔŔţÁÁţÂÂţĂĂţÄÄţĆĆţÇÇţËËţĎĎţĐĐţŐŐţÖÖţÚÚţÜÜţŢŢţááţăăţĺĺţççţččţééţęęţëëţěěţííţîîţđđţńńţňňţóóţőőţööţ÷÷ţřřţůůţúúţűűţüüţýýţţţţţ˙˙˙˙˙˙˙ ˙˙˙˙˙$$˙**˙,,˙00˙55˙66˙==˙CC˙GG˙HH˙KK˙LL˙PP˙WW˙ee˙ff˙ii˙tt˙xx˙{{˙}}˙ŠŠ˙˜˜˙ŞŞ˙­­˙°°˙ˇˇ˙źź˙żż˙ĆĆ˙ČČ˙ËË˙ÍÍ˙ĐĐ˙××˙ŘŘ˙ŮŮ˙ÚÚ˙ÝÝ˙áá˙ää˙éé˙ěě˙íí˙ńń˙óó˙öö˙÷÷˙řř˙ůů˙űű˙üü˙ýý˙ţţ˙˙ţ˙˙˙ż…(üzđ ˙ż\óżó¸ŃŹŕ@@44kŽŽ0`Ít0˙˙t˙˙` óÍŐ˙ż@-@Üötżä<ŹóňńżżżŽ|U™+‘`¸đÍyzń(,zń ˙ż!ţ+CREATOR: The GIMP's PNM Filter Version 1.0 ,00ţ ¨l Ae&4Ȱ!C… |QĄĂ‹!b0Ŕˇ‚e‘ äžp 8đŐ­ r‚W2Ȩđl!klBf‘Ç@U@ÁőŔ âB„"~0Dˆ „áP/BóÎë)¸ŕP,oŔ_¤ g2HOˆË0"$9ç2L ĐźH]T/CoHńoÉ<íąrŚâ^ UĚ<ľJsÍRĺŹóÎ<÷ěóĎ@-ôĐDmôŃH'P@;proftpd/images/misc.gif0100644000567100000120000000071407401421102015075 0ustar jcameronwheelGIF89a00Ą˙˙˙™™™ĚĚĚ!ů,00ţ„ ź×Œň͋T˛Vcę}Âhšœc#éśá+‚vÎŃݸh%A¨ 9›ôą@žZ ÁK9ž=éÇZâe/Líž|Ç]Č7Œ&‹Ë[´ŰgÖĆľgę…*U{ag&2ř ˇÇ%ç'˜ XXSgGG(ŮF¨u²YöÂsĂ)ň’y„ôö–9%33ŔúÁ:`đ {đË ËňzŃK;;Űú`{›Pô ąœÜŞ0ťmÁĘŰŹ Ź­ D-1ŔëĚ,ží,ÍL:-ÎN.lý-gűŰęînüî6<, †eúÂü#—şƒŚžąKćĄÂˆŔ Œ5A˘Żž‰şđcĺąăhZié5rÖI#+vÜwĂĘBŮŘT˘ĄHŽÎB‘ćěĚ ŚO 1=cääY4MO‚|œ*Â閦NwšʇRŇ,tF…ĂÇęžN^˝ÜÔ uiY˘\'QZÔ' 3q꾅w Jdł~ťöŞŕÁ„ ßqô¤†up(EJąŕ˜nŹj‰ĺ;˜)kV…ůň!Ȓ1;proftpd/images/anon.gif0100644000567100000120000000035507401421102015076 0ustar jcameronwheelGIF89a00Ąřüř`d`ČĚČ˙˙˙!ţMade with GIMP!ů ,00ʜŠËíٜ´Ú‹OŘ<_v^–âȘj€ŚĄĂaŤ”rĎ´a߸żŮ zN$4@mĹl:QПt:ŞKĎՖۂ^OYďRŐ­ŽŇjÓÎź~+żH9ńŹłżđuá°äLjĺ(X‡¸śčŇç˜ůEy舉HX¨§śÉŮIjˆ„–fę†Z&‚V8ęę+j‘÷Z+›Ëz ™Ť›ě;Á,ĚP;proftpd/images/virt.gif0100664000567100000120000000301307401421102015123 0ustar jcameronwheelGIF89a00÷ýýţţţţţţţţţţţ ţ ţ ţ ţţţţţţţţţţ ţ$$ţ%%ţ''ţ((ţ))ţ,,ţ--ţ..ţ22ţ55ţ66ţ::ţ;;ţ==ţ>>ţ??ţAAţEEţHHţMMţOOţPPţRRţSSţUUţXXţZZţ]]ţ__ţ``ţccţddţeeţffţiiţmmţnnţooţppţrrţssţvvţzzţ||ţ~~ţţţ‚‚ţ††ţ‰‰ţŠŠţŽŽţ’’ţ““ţ••ţœœţţ˘˘ţ§§ţŠŠţŞŞţ°°ţąąţśśţˇˇţ¸¸ţššţťťţźźţ˝˝ţžžţżżţŔŔţÁÁţÂÂţĂĂţÄÄţĆĆţÇÇţËËţĎĎţĐĐţŐŐţÖÖţÚÚţÜÜţŢŢţááţăăţĺĺţççţččţééţęęţëëţěěţííţîîţđđţńńţňňţóóţőőţööţ÷÷ţřřţůůţúúţűűţüüţýýţţţţţ˙˙˙˙˙˙˙ ˙˙˙˙˙$$˙**˙,,˙00˙55˙66˙==˙CC˙GG˙HH˙KK˙LL˙PP˙WW˙ee˙ff˙ii˙tt˙xx˙{{˙}}˙ŠŠ˙˜˜˙ŞŞ˙­­˙°°˙ˇˇ˙źź˙żż˙ĆĆ˙ČČ˙ËË˙ÍÍ˙ĐĐ˙××˙ŘŘ˙ŮŮ˙ÚÚ˙ÝÝ˙áá˙ää˙éé˙ěě˙íí˙ńń˙óó˙öö˙÷÷˙řř˙ůů˙űű˙üü˙ýý˙ţţ˙˙ţ˙˙˙ż…(üzđ ˙ż\óżó¸ŃŹŕ@@44kŽŽ0`Ít0˙˙t˙˙` óÍŐ˙ż@-@Üötżä<ŹóňńżżżŽ|U™+‘`¸đÍyzń(,zń ˙ż!ţ+CREATOR: The GIMP's PNM Filter Version 1.0 ,00ţ ¨l Ae&4Ȱ!C… |QĄĂ‹!b0Ŕˇ‚e‘ äžp 8đŐ­ r‚W2Ȩđl!klBf‘Ç@U@ÁőŔ âB„"~0Dˆ „áP/BóÎë)¸ŕP,oŔ_¤ g2HOˆË0"$9ç2L ĐźH]T/CoHńoÉ<íąrŚâ^ UĚ<ľJsÍRĺŹóÎ<÷ěóĎ@-ôĐDmôŃH'P@;proftpd/images/log.gif0100644000567100000120000000072607401421102014726 0ustar jcameronwheelGIF89a00™™™fffĚĚĚ˙˙˙!ů,00ţŞąţb 1Ş˝8[ĐÚű h$x¨ă…`YvÜş†0ՊŤĹ'z7ZDgâ;3IäQ ‰•˛s4qÚ“(•ĽKĽśi+CťÝců bo]č¸7LgŽÍ\yŻG/úo$zhwak†~#:ƒiN…"€ŠpŒ|‰‘Žay”–"˜D” ‘cwŽD6ĄƒdVŸ:ŞrŹ6XˆP˛~­™¨ şŁ–Aśx° şź˝Nl9Čm ˛ÄľĆ.,VŞÖŇIĐŕ,ĄbÝ ăá YÖdTđcX>ćmßzço)VKAÍúçN„*WšuË7Çž_>Ů1ĆĐTAŠ#*=ƒŕœŠáFWwh,4ńŽG’ĹBëóçŃJ‹Žúź4ťK5Éźƒd‘”=Zždö|4"'–.mMŞ3™Ď™‡j …šé7 …^Ęj’ę>D'ë4%#rĹG_eź8J2ÓHgĽ:ž˝86c%ŠüNĽIˆďT”ŞŮń[öŽÔÁÇŽÂS’âĹ i0;oÁ ĘÉâúĺB‹Î C‹MúB;proftpd/images/dirs.gif0100644000567100000120000000041207401421102015076 0ustar jcameronwheelGIF89a00Â˙˙˙ĚĚ̙™™fff!ů,00ĎşÜţ0ĘIë 8 ˧ř ؍NfžćFRAčžĂĘžôËR[Ăxžó=ˆîşKĐńČ&—L…“NUćuEŠF‚xL./wŃ j­‰gIۈ@€Çłşý9Ż_ârtƒ„ƒ1[5x…Œ‡€a}{T’€Šz–w•>—afŁo‚~i ¨šŞŹ9'_AŻhG´ll˛¸HŸŚ“XŠš˜ž ˆ4Ǎ…ŔŽĎ†Ë@ÓÂ\ÄżœÁ›|ߞŢ٤¤Ü­‹§ęÉQ ;proftpd/images/type_icon_0.gif0100644000567100000120000000073607401421102016356 0ustar jcameronwheelGIF89a00Â˙˙˙fffĚĚ̙™™!ů,00ţşÜţ0śŔč˛tý”*ŁÓ]˜WĽßć’*Ůž+Ë\=w1}ć"Úd'$nNˇ¤Ƀí˜=‰t*X‹ŤŤŘ^ł_*@ ö–ˇgq—Ënw×đq\m×ëv;ďŤá_|{~y\ ‹†‡zk{\}Ž’qŠ‹•x]‹ žŒŠR˘•Œyž™ŠV§ŒS¤ĽĽźŠ­¤´T¨¨ ­˼Ŕš’ÇĎÄTŃŐťźŔŮŐŮÎŘŮÖ ×Ř ×Ççäčâë ěăęćâäôđřéďńóřňúĘĺkgíÝ?ýÚí:žA‡ †“hn⦋3j|@¤FÔ¤C†"!ň’¤’śT‰ f¤tl r@hfĚšÉsBÎB;ćňtJQŹ\†R˝˘téŐŻRąŠ‚ŠEŚŮ,PcŠQ­ôóS3ĽĄşFEĘ5+UĄ´ŇJĂ ,˛ˇŇ6JÂĺpşˆvńîă†PŃ݆ÚŰ7p=yˆOIÇqB‚ÝVÜďq@ CśwŮŽŕ͉K´Č—"ĈĽE˕<%;proftpd/images/type_icon_5.gif0100644000567100000120000000060607401421102016357 0ustar jcameronwheelGIF89a00Ą˙˙˙fffĚĚĚ!ů,00ţ„ŠËíٜ&X …ŽśăŚ…OG~Jˆ:¤g"¨ŘŹÜž›Ú˝-` ŐŰé8Aám´ –5鵌b†ąU(ŠĎ €•JśŠnRfF6˘#â8_łc_ŰWTfJőă§WÁŚÁ7@qˆwg(öw@sôČw––řpt٘yČ'ŔéŮČă&h°‘Ä$塠:[vƒ˜ŰY‡ĘđY:ŕŹ›ąz҈ ś4Źeœđřť!śźűC˜œJ ’Reš¤÷ťMÜkÇ MČžŽŤË-{Žc))ţZ~J˙ÍZ_mßMuś&)óW‰ƒhx,0ű‡/ ÂhN`žXŠń`<–` LLn|tÁK‹T™Œež%= ™Ζ‰^‹×­‘'YĆ<†Ęˆ˘Ćž-ČT§SPoŚ’:•fU˜4> FľčŽąd˚[;proftpd/images/type_icon_3.gif0100644000567100000120000000042307401421102016352 0ustar jcameronwheelGIF89a00Â˙˙˙ĚĚ̙™™fff!ů,00ŘşÜţ0ĘIŤ˝8ËŔ{י'Ž8yBŞŽ‚gB]zśđ:œm}÷’‡ľžâ‡!öŒť Ya‚œMĺ JĄ^ŹŠ áVľW°Ćű gu@ôVU?Ů_w†EŻŰ/Á`Ďďű˙}y€„|‚&z„†Ž†ŒŠ ‘’Žƒ€—•‰š–œž{“¤Ľ˘Ł› ~ŞŤ’­Žœ¨Śsˆ´ľˇľ‰ˆś˛ĄžÂ‹ÁśŔšĂł°™ÇÁŽĹźĹÉÎŹĐšĘϔČŇŃ̅رڍ*áćČé ׯďBňóôőö÷ ;proftpd/images/dir.gif0100644000567100000120000000041207401421102014713 0ustar jcameronwheelGIF89a00Â˙˙˙ĚĚ̙™™fff!ů,00ĎşÜţ0ĘIë 8 ˧ř ؍NfžćFRAčžĂĘžôËR[Ăxžó=ˆîşKĐńČ&—L…“NUćuEŠF‚xL./wŃ j­‰gIۈ@€Çłşý9Ż_ârtƒ„ƒ1[5x…Œ‡€a}{T’€Šz–w•>—afŁo‚~i ¨šŞŹ9'_AŻhG´ll˛¸HŸŚ“XŠš˜ž ˆ4Ǎ…ŔŽĎ†Ë@ÓÂ\ÄżœÁ›|ߞŢ٤¤Ü­‹§ęÉQ ;proftpd/images/type_icon_1.gif0100644000567100000120000000072607401421102016356 0ustar jcameronwheelGIF89a00™™™fffĚĚĚ˙˙˙!ů,00ţŞąţb 1Ş˝8[ĐÚű h$x¨ă…`YvÜş†0ՊŤĹ'z7ZDgâ;3IäQ ‰•˛s4qÚ“(•ĽKĽśi+CťÝců bo]č¸7LgŽÍ\yŻG/úo$zhwak†~#:ƒiN…"€ŠpŒ|‰‘Žay”–"˜D” ‘cwŽD6ĄƒdVŸ:ŞrŹ6XˆP˛~­™¨ şŁ–Aśx° şź˝Nl9Čm ˛ÄľĆ.,VŞÖŇIĐŕ,ĄbÝ ăá YÖdTđcX>ćmßzço)VKAÍúçN„*WšuË7Çž_>Ů1ĆĐTAŠ#*=ƒŕœŠáFWwh,4ńŽG’ĹBëóçŃJ‹Žúź4ťK5Éźƒd‘”=Zždö|4"'–.mMŞ3™Ď™‡j …šé7 …^Ęj’ę>D'ë4%#rĹG_eź8J2ÓHgĽ:ž˝86c%ŠüNĽIˆďT”ŞŮń[öŽÔÁÇŽÂS’âĹ i0;oÁ ĘÉâúĺB‹Î C‹MúB;proftpd/images/type_icon_6.gif0100644000567100000120000000046007401421102016356 0ustar jcameronwheelGIF89a00Â˙˙˙ĚĚĚfff˙˙˙˙˙˙˙˙˙˙˙˙!ů,00őşÜţ0ĘIŤ [—őĆB( 0ŠŢ„hšL¨$ÄN÷#ĚŃ忚Ž÷đIÉ@h#6Œżdd‰s2 6)„z´.°:íƒűó*Ŕ¤’9 F)ä4ť5_¨'q:h‚ý €A'K|tH†'%…v‡9…%{s‚•€˜™š7œž#Ą¤‘Ľ˘u¨'ŞŤƒŚŻ/@ ˛—§ś ľŤźź¤ż}ŽĄÁą˛ĹˇŻČ1šł;™+͖Kf=HËĚ<Ôwѕ#ڌgŁłŠŐŃ×ĂɆĽ!IÁ2 bĄRé–çéôć˛űüĄhA`(‚ÚĄz׉_=[#–J;proftpd/images/type_icon_4.gif0100644000567100000120000000071407401421102016356 0ustar jcameronwheelGIF89a00Ą˙˙˙™™™ĚĚĚ!ů,00ţ„ ź×Œň͋T˛Vcę}Âhšœc#éśá+‚vÎŃݸh%A¨ 9›ôą@žZ ÁK9ž=éÇZâe/Líž|Ç]Č7Œ&‹Ë[´ŰgÖĆľgę…*U{ag&2ř ˇÇ%ç'˜ XXSgGG(ŮF¨u²YöÂsĂ)ň’y„ôö–9%33ŔúÁ:`đ {đË ËňzŃK;;Űú`{›Pô ąœÜŞ0ťmÁĘŰŹ Ź­ D-1ŔëĚ,ží,ÍL:-ÎN.lý-gűŰęînüî6<, †eúÂü#—şƒŚžąKćĄÂˆŔ Œ5A˘Żž‰şđcĺąăhZié5rÖI#+vÜwĂĘBŮŘT˘ĄHŽÎB‘ćěĚ ŚO 1=cääY4MO‚|œ*Â閦NwšʇRŇ,tF…ĂÇęžN^˝ÜÔ uiY˘\'QZÔ' 3q꾅w Jdł~ťöŞŕÁ„ ßqô¤†up(EJąŕ˜nŹj‰ĺ;˜)kV…ůň!Ȓ1;proftpd/images/type_icon_2.gif0100644000567100000120000000056507401421102016360 0ustar jcameronwheelGIF89a00ă˙˙˙™™™ĚĚĚfff˙˙˙˙˙˙!ů,00ţČIŤ˝8ëÍť˙`(Žc œhŞŽd˜kˇÓk¸€ş@üŔ߉°Ádž`Ą@śŒÜnw –MÁŠŹpA§úš h´o ƒČŻŽŕ0nźŹ3çîvwwyrH‚ˆxZ!'Tf}}RĐüXو&„˝hĘeńš[ňŽXęiFˇŕjW‹cŠ{;ąÄłÝň9)nŤkQ¨Ěü›÷FlM#†‚ˆqW‰F5R/š"†™+ld‘€œŒ ƒŞ‰’§9Cš­†ŠM´x˝SQ †™}ŁTZorœ jN­d’omÁ ÎmhuV1k„” ÂÚĆUvÝŞ,ÍÂĘež{PL}𹠯ћ9$ěătőłá㚻‰ŕ;ˆ‘ ôýřł"މ`ř9sŽĐň U@ ç"ś"JÉ+š˛Bqýu|˘ ťˆ1SNB7gƒ(Ev:†‹rn“Ž$CQôĘĄ†XłjÝĘľŤ×Ż`ÊKśŹŮł]C;proftpd/images/limit.gif0100664000567100000120000000045007401421102015257 0ustar jcameronwheelGIF87a00€˙˙˙,00ţŒŠËíŁ´Údó ZĘu"fF9žŔˇ’ ;˝oČ2s Ç*N/÷žëÉZ˝"†Č WŠb3BŞL.âěÉęĨŸÍăłJuáX9 GŽ^cňý­’ę˛ÔŰΟŤĎ ŞŻ6Ĺô‡$B'Ą¸ČŘčřů•Fˆ¸…wXUr4ˆĆĆĆóӄ7*–¤W—čt 禔cšťšľ:ŠĘˇˇ[ËŮ; ĺ@J늜ú;ť5œÜ†üŠ+ÇÜL–i+ź-<ÉÝ­9&i~ŽžI2čąů€2.ć'/É7• N]} ČÉÚ+×^aŠš¨3 %˜Ąľ,™ Ÿ•TČMDiŮÚe,ڤ;proftpd/images/ftpusers.gif0100644000567100000120000000060607401421102016015 0ustar jcameronwheelGIF89a00Ą˙˙˙fffĚĚĚ!ů,00ţ„ŠËíٜ&X …ŽśăŚ…OG~Jˆ:¤g"¨ŘŹÜž›Ú˝-` ŐŰé8Aám´ –5鵌b†ąU(ŠĎ €•JśŠnRfF6˘#â8_łc_ŰWTfJőă§WÁŚÁ7@qˆwg(öw@sôČw––řpt٘yČ'ŔéŮČă&h°‘Ä$塠:[vƒ˜ŰY‡ĘđY:ŕŹ›ąz҈ ś4Źeœđřť!śźűC˜œJ ’Reš¤÷ťMÜkÇ MČžŽŤË-{Žc))ţZ~J˙ÍZ_mßMuś&)óW‰ƒhx,0ű‡/ ÂhN`žXŠń`<–` LLn|tÁK‹T™Œež%= ™Ζ‰^‹×­‘'YĆ<†Ęˆ˘Ćž-ČT§SPoŚ’:•fU˜4> FľčŽąd˚[;proftpd/proftpd-lib.pl0100644000567100000120000003675007401421102014776 0ustar jcameronwheel# proftpd-lib.pl # Common functions for the proftpd server config file do '../web-lib.pl'; &init_config(); # Load the site-specific information on the server executable &read_file("$module_config_directory/site", \%site); @ftpaccess_files = split(/\s+/, $site{'ftpaccess'}); opendir(DIR, "."); foreach $f (readdir(DIR)) { if ($f =~ /^(mod_\S+)\.pl$/) { push(@module_files, $1); do $f; } } closedir(DIR); # get_config() # Returns the entire proftpd config structure sub get_config { if (@get_config_cache) { return \@get_config_cache; } @get_config_cache = &get_config_file($config{'proftpd_conf'}); foreach $inc (&find_directive("Include", \@get_config_cache)) { push(@get_config_cache, &get_config_file($inc)); } return \@get_config_cache; } # get_config_file(filename) sub get_config_file { local @rv; if (opendir(DIR, $_[0])) { # Is a directory .. parse all files! local @files = readdir(DIR); closedir(DIR); foreach $f (@files) { next if ($f =~ /^\./); push(@rv, &get_config_file("$_[0]/$f")); } } else { # Just a normal config file local $lnum = 0; open(CONF, $_[0]); @rv = &parse_config_file(CONF, $lnum, $_[0]); close(CONF); } return @rv; } # parse_config_file(handle, lines, file) # Parses lines of text from some config file into a data structure. The # return value is an array of references, one for each directive in the file. # Each reference points to an associative array containing # line - The line number this directive is at # eline - The line number this directive ends at # file - The file this directive is from # type - 0 for a normal directive, 1 for a container directive # name - The name of this directive # value - Value (possibly with spaces) # members - For type 1, a reference to the array of members sub parse_config_file { local($fh, @rv, $line, %dummy); $fh = $_[0]; $dummy{'line'} = $dummy{'eline'} = $_[1]-1; $dummy{'file'} = $_[2]; $dummy{'type'} = 0; $dummy{'name'} = "dummy"; @rv = (\%dummy); while($line = <$fh>) { chop; $line =~ s/^\s*#.*$//g; if ($line =~ /^\s*<\/(\S+)\s*(.*)>/) { # end of a container directive. This can only happen in a # recursive call to this function $_[1]++; last; } elsif ($line =~ /^\s*/i) { # start of an IfModule block. Read it, and if the module # exists put the directives in this section. local ($not, $mod) = ($1, $2); local $oldline = $_[1]; $_[1]++; local @dirs = &parse_config_file($fh, $_[1], $_[2]); if (!$not && $httpd_modules{$mod} || $not && !$httpd_modules{$mod}) { # use the directives.. push(@rv, { 'line', $oldline, 'eline', $oldline, 'file', $_[2], 'name', "" }); push(@rv, @dirs); push(@rv, { 'line', $_[1]-1, 'eline', $_[1]-1, 'file', $_[2], 'name', "" }); } } elsif ($line =~ /^\s*/i) { # start of an IfDefine block. Read it, and if the define # exists put the directives in this section local ($not, $def) = ($1, $2); local $oldline = $_[1]; $_[1]++; local @dirs = &parse_config_file($fh, $_[1], $_[2]); if (!$not && $httpd_defines{$def} || $not && !$httpd_defines{$def}) { # use the directives.. push(@rv, { 'line', $oldline, 'eline', $oldline, 'file', $_[2], 'name', "" }); push(@rv, @dirs); push(@rv, { 'line', $_[1]-1, 'eline', $_[1]-1, 'file', $_[2], 'name', "" }); } } elsif ($line =~ /^\s*<(\S+)\s*(.*)>/) { # start of a container directive. The first member is a dummy # directive at the same line as the container local(%dir, @members); %dir = ('line', $_[1], 'file', $_[2], 'type', 1, 'name', $1, 'value', $2); $dir{'value'} =~ s/\s+$//g; $dir{'words'} = &wsplit($dir{'value'}); $_[1]++; @members = &parse_config_file($fh, $_[1], $_[2]); $dir{'members'} = \@members; $dir{'eline'} = $_[1]-1; push(@rv, \%dir); } elsif ($line =~ /^\s*(\S+)\s*(.*)$/) { # normal directive local(%dir); %dir = ('line', $_[1], 'eline', $_[1], 'file', $_[2], 'type', 0, 'name', $1, 'value', $2); if ($dir{'value'} =~ s/\\$//g) { # multi-line directive! while($line = <$fh>) { chop($line); $cont = ($line =~ s/\\$//g); $dir{'value'} .= $line; $dir{'eline'} = ++$_[1]; if (!$cont) { last; } } } $dir{'value'} =~ s/\s+$//g; $dir{'words'} = &wsplit($dir{'value'}); push(@rv, \%dir); $_[1]++; } else { # blank or comment line $_[1]++; } } return @rv; } # wsplit(string) # Splits a string like foo "foo \"bar\"" bazzz into an array of words sub wsplit { local($s, @rv); $s = $_[0]; $s =~ s/\\\"/\0/g; while($s =~ /^"([^"]*)"\s*(.*)$/ || $s =~ /^(\S+)\s*(.*)$/) { $w = $1; $s = $2; $w =~ s/\0/"/g; push(@rv, $w); } return \@rv; } # wjoin(word, word, ...) sub wjoin { local(@rv, $w); foreach $w (@_) { if ($w =~ /^\S+$/) { push(@rv, $w); } else { push(@rv, "\"$w\""); } } return join(' ', @rv); } # find_directive(name, &directives) # Returns the values of directives matching some name sub find_directive { local(@rv, $i, @vals, $dref); foreach $ref (@{$_[1]}) { if (lc($ref->{'name'}) eq lc($_[0])) { push(@vals, $ref->{'words'}->[0]); } } return wantarray ? @vals : !@vals ? undef : $vals[$#vals]; } # find_directive_struct(name, &directives) # Returns references to directives maching some name sub find_directive_struct { local(@rv, $i, @vals); foreach $ref (@{$_[1]}) { if (lc($ref->{'name'}) eq lc($_[0])) { push(@vals, $ref); } } return wantarray ? @vals : !@vals ? undef : $vals[$#vals]; } # find_vdirective(name, &virtualdirectives, &directives) # Looks for some directive in a section, and then in the # main section sub find_vdirective { if ($_[1]) { $rv = &find_directive($_[0], $_[1]); if ($rv) { return $rv; } } return &find_directive($_[0], $_[2]); } # make_directives(ref, version, module) sub make_directives { local @rv; local $ver = $_[1]; foreach $d (@{$_[0]}) { local(%dir); $dir{'name'} = $d->[0]; $dir{'multiple'} = $d->[1]; $dir{'type'} = $d->[2]; $dir{'module'} = $_[2]; $dir{'version'} = $_[1]; $dir{'priority'} = $d->[5]; foreach $c (split(/\s+/, $d->[3])) { $dir{$c}++; } if (!$d->[4]) { push(@rv, \%dir); } elsif ($d->[4] =~ /^-([\d\.]+)$/ && $ver < $1) { push(@rv, \%dir); } elsif ($d->[4] =~ /^([\d\.]+)$/ && $ver >= $1) { push(@rv, \%dir); } elsif ($d->[4] =~ /^([\d\.]+)-([\d\.]+)$/ && $ver >= $1 && $ver < $2) { push(@rv, \%dir); } } return @rv; } # editable_directives(type, context) # Returns an array of references to associative arrays, one for each # directive of the given type that can be used in the given context sub editable_directives { local($m, $func, @rv); local @mods = split(/\s+/, $site{'modules'}); foreach $m (@module_files) { if (&indexof($m, @mods) != -1) { $func = $m."_directives"; push(@rv, &$func($site{'version'})); } } @rv = grep { $_->{'type'} == $_[0] && $_->{$_[1]} } @rv; @rv = sort { $pd = $b->{'priority'} - $a->{'priority'}; $md = $a->{'module'} cmp $b->{'module'}; $pd == 0 ? ($md == 0 ? $a->{'name'} cmp $b->{'name'} : $md) : $pd } @rv; return @rv; } # generate_inputs(&editors, &directives) # Displays a 2-column list of options, for use inside a table sub generate_inputs { local($e, $sw, @args, @rv, $func); foreach $e (@{$_[0]}) { if (!$sw) { print "\n"; } # Build arg list for the editing function. Each arg can be a single # directive struct, or a reference to an array of structures. $func = "edit"; undef(@args); foreach $ed (split(/\s+/, $e->{'name'})) { local(@vals); $func .= "_$ed"; @vals = &find_directive_struct($ed, $_[1]); if ($e->{'multiple'}) { push(@args, \@vals); } elsif (!@vals) { push(@args, undef); } else { push(@args, $vals[$#vals]); } } push(@args, $e); # call the function @rv = &$func(@args); if ($rv[0] == 2) { # spans 2 columns.. if ($sw) { # need to end this row print " \n"; } else { $sw = !$sw; } print "$rv[1]\n"; print "$rv[2]\n"; } else { # only spans one column print "$rv[1]\n"; print "$rv[2]\n"; } if ($sw) { print "\n"; } $sw = !$sw; } } # parse_inputs(&editors, &directives, &config) # Reads user choices from a form and update the directives and config files. sub parse_inputs { # First call editor functions to get new values. Each function returns # an array of references to arrays containing the new values for the directive. local ($i, @chname, @chval); foreach $e (@{$_[0]}) { local @dirs = split(/\s+/, $e->{'name'}); local $func = "save_".join('_', @dirs); local @rv = &$func($e); for($i=0; $i<@dirs; $i++) { push(@chname, $dirs[$i]); push(@chval, $rv[$i]); } } # Assuming everything went OK, update the configuration for($i=0; $i<@chname; $i++) { &save_directive($chname[$i], $chval[$i], $_[1], $_[2]); } &flush_file_lines(); } # opt_input(value, name, default, size, [units]) sub opt_input { return sprintf " $_[2]\n". "\n". " %s\n", defined($_[0]) ? "" : "checked", defined($_[0]) ? "checked" : "", $_[0], $_[4]; } # parse_opt(name, regexp, error) sub parse_opt { local($i, $re); if ($in{"$_[0]_def"}) { return ( [ ] ); } for($i=1; $i<@_; $i+=2) { $re = $_[$i]; if ($in{$_[0]} !~ /$re/) { &error($_[$i+1]); } } return ( [ $in{$_[0]} ] ); } # choice_input(value, name, default, [choice]+) # Each choice is a display,value pair sub choice_input { local($i, $rv); for($i=3; $i<@_; $i++) { $_[$i] =~ /^([^,]*),(.*)$/; $rv .= sprintf " $1\n", lc($2) eq lc($_[0]) || lc($2) eq 'on' && lc($_[0]) eq 'yes' || lc($2) eq 'off' && lc($_[0]) eq 'no' || !defined($_[0]) && lc($2) eq lc($_[2]) ? "checked" : ""; } return $rv; } # choice_input_vert(value, name, default, [choice]+) # Each choice is a display,value pair sub choice_input_vert { local($i, $rv); for($i=3; $i<@_; $i++) { $_[$i] =~ /^([^,]*),(.*)$/; $rv .= sprintf " $1
\n", lc($2) eq lc($_[0]) || !defined($_[0]) && lc($2) eq lc($_[2]) ? "checked" : ""; } return $rv; } # parse_choice(name, default) sub parse_choice { if (lc($in{$_[0]}) eq lc($_[1])) { return ( [ ] ); } else { return ( [ $in{$_[0]} ] ); } } # select_input(value, name, default, [choice]+) sub select_input { local($i, $rv); $rv = "\n"; return $rv; } # parse_choice(name, default) sub parse_select { return &parse_choice(@_); } # config_icons(contexts, program) # Displays up to 17 icons, one for each type of configuration directive, for # some context (global, virtual, directory or htaccess) sub config_icons { local($m, $func, $e, %etype, $i, $c); local @mods = split(/\s+/, $site{'modules'}); local @ctx = split(/\s+/, $_[0]); foreach $m (sort { $a cmp $b } (@module_files)) { if (&indexof($m, @mods) != -1) { $func = $m."_directives"; foreach $e (&$func($site{'version'})) { foreach $c (@ctx) { $etype{$e->{'type'}}++ if ($e->{$c}); } } } } print "\n"; for($i=0; $text{"type_$i"}; $i++) { if ($etype{$i}) { if ($c%5 == 0) { print "\n"; } print "\n"; if ($c%5 == 4) { print "\n"; } $c++; } } for($i=2; $i<@_; $i++) { if ($c%5 == 0) { print "\n"; } print "\n"; if ($c%5 == 4) { print "\n"; } $c++; } while($c++ % 5) { print "\n"; } print "
\n"; &generate_icon("images/type_icon_$i.gif", $text{"type_$i"}, $_[1]."type=$i"); print "
\n"; &generate_icon($_[$i]->{'icon'}, $_[$i]->{'name'}, $_[$i]->{'link'}); print "

\n"; } sub lock_proftpd_files { local $conf = &get_config(); foreach $f (&unique(map { $_->{'file'} } @$conf)) { &lock_file($f); } } sub unlock_proftpd_files { local $conf = &get_config(); foreach $f (&unique(map { $_->{'file'} } @$conf)) { &unlock_file($f); } } # save_directive(name, &values, &directives, &config) # Updates the config file(s) and the directives structure with new values # for the given directives. # If a directive's value is merely being changed, then its value only needs # to be updated in the directives array and in the file. sub save_directive { local($i, @old, $lref, $change, $len, $v); @old = &find_directive_struct($_[0], $_[2]); for($i=0; $i<@old || $i<@{$_[1]}; $i++) { $v = ${$_[1]}[$i]; if ($i >= @old) { # a new directive is being added. If other directives of this # type exist, add it after them. Otherwise, put it at the end of # the first file in the section if ($change) { # Have changed some old directive.. add this new one # after it, and update change local(%v, $j); %v = ( "line", $change->{'line'}+1, "eline", $change->{'line'}+1, "file", $change->{'file'}, "type", 0, "name", $_[0], "value", $v); $j = &indexof($change, @{$_[2]})+1; &renumber($_[3], $v{'line'}, $v{'file'}, 1); splice(@{$_[2]}, $j, 0, \%v); $lref = &read_file_lines($v{'file'}); splice(@$lref, $v{'line'}, 0, "$_[0] $v"); $change = \%v; } else { # Adding a new directive to the end of the list # in this section local($f, %v, $j, $l); $f = $_[2]->[0]->{'file'}; for($j=0; $_[2]->[$j]->{'file'} eq $f; $j++) { } $l = $_[2]->[$j-1]->{'eline'}+1; %v = ( "line", $l, "eline", $l, "file", $f, "type", 0, "name", $_[0], "value", $v); &renumber($_[3], $l, $f, 1); splice(@{$_[2]}, $j, 0, \%v); $lref = &read_file_lines($f); splice(@$lref, $l, 0, "$_[0] $v"); } } elsif ($i >= @{$_[1]}) { # a directive was deleted $lref = &read_file_lines($old[$i]->{'file'}); $idx = &indexof($old[$i], @{$_[2]}); splice(@{$_[2]}, $idx, 1); $len = $old[$i]->{'eline'} - $old[$i]->{'line'} + 1; splice(@$lref, $old[$i]->{'line'}, $len); &renumber($_[3], $old[$i]->{'line'}, $old[$i]->{'file'}, -$len); } else { # just changing the value $lref = &read_file_lines($old[$i]->{'file'}); $len = $old[$i]->{'eline'} - $old[$i]->{'line'} + 1; &renumber($_[3], $old[$i]->{'eline'}+1, $old[$i]->{'file'},1-$len); $old[$i]->{'value'} = $v; $old[$i]->{'eline'} = $old[$i]->{'line'}; splice(@$lref, $old[$i]->{'line'}, $len, "$_[0] $v"); $change = $old[$i]; } } } # renumber(&config, line, file, offset) # Recursively changes the line number of all directives from some file # beyond the given line. sub renumber { local($d); if (!$_[3]) { return; } foreach $d (@{$_[0]}) { if ($d->{'file'} eq $_[2] && $d->{'line'} >= $_[1]) { $d->{'line'} += $_[3]; } if ($d->{'file'} eq $_[2] && $d->{'eline'} >= $_[1]) { $d->{'eline'} += $_[3]; } if ($d->{'type'}) { &renumber($d->{'members'}, $_[1], $_[2], $_[3]); } } } sub def { return $_[0] ? $_[0] : $_[1]; } # get_virtual_config(index) sub get_virtual_config { local($conf, $c, $v); $conf = &get_config(); if (!$_[0]) { $c = $conf; $v = undef; } else { $c = $conf->[$_[0]]->{'members'}; $v = $conf->[$_[0]]; } return wantarray ? ($c, $v) : $c; } # get_ftpaccess_config(file) sub get_ftpaccess_config { local($lnum, @conf); open(FTPACCESS, $_[0]); @conf = &parse_config_file(FTPACCESS, $lnum, $_[0]); close(FTPACCESS); return \@conf; } 1; proftpd/module.info0100644000567100000120000000022107401421104014343 0ustar jcameronwheelcategory=servers depends=0.91 desc_pl=Serwer ProFTP desc=ProFTP Server version=0.91 desc_es=Servidor ProFTP desc_ca=Servidor ProFTP name=ProFTPd proftpd/start.cgi0100755000567100000120000000076407401421102014037 0ustar jcameronwheel#!/usr/local/bin/perl # start.cgi # Start the ProFTPD server process require './proftpd-lib.pl'; &error_setup($text{'start_err'}); $conf = &get_config(); $st = &find_directive("ServerType", $conf); if ($st eq 'inetd') { &error($text{'start_einetd'}); } if ($config{'start_cmd'}) { $out = &backquote_logged("$config{'start_cmd'} 2>&1 &1 \n"; # Check if proftpd is installed @st = stat($config{'proftpd_path'}); if (!@st) { print "

",&text('index_eproftpd', "$config{'proftpd_path'}", "/config.cgi?$module_name"),"

\n"; print "


\n"; &footer("/", $text{'index'}); exit; } # Check if the config file exists @conf = &get_config(); if (!@conf) { print "

",&text('index_econf', "$config{'proftpd_conf'}", "/config.cgi?$module_name"),"

\n"; print "


\n"; &footer("/", $text{'index'}); exit; } # Check if the executable has changed .. if ($site{'size'} != $st[7]) { # Check if it really is proftpd and the right version $site{'size'} = $st[7]; $out = `$config{'proftpd_path'} -v 2>&1`; if ($out !~ /ProFTPD\s+Version\s+(\d+)\.([0-9\.]+)/i) { print "

",&text('index_eproftpd2', "$config{'proftpd_path'}", "/config.cgi?$module_name"),"

\n"; print "


\n"; &footer("/", $text{'index'}); exit; } local ($v1, $v2) = ($1, $2); $v2 =~ s/\.//g; $site{'version'} = "$v1.$v2"; if ($site{'version'} < 0.99) { print "

",&text('index_eversion', "$config{'proftpd_path'}", "/config.cgi?$module_name"),"

\n"; print "


\n"; &footer("/", $text{'index'}); exit; } # Get the list of modules local @mods; open(MODS, "$config{'proftpd_path'} -l |"); while() { s/\r|\n//g; if (/^\s*(\S+)\.c$/) { push(@mods, $1); } } close(MODS); $site{'modules'} = join(" ", @mods); &write_file("$module_config_directory/site", \%site); } # Display global category icons print "

$text{'index_global'}

\n"; $ft_icon = { "icon" => "images/dir.gif", "name" => $text{'ftpaccess_title'}, "link" => "ftpaccess.cgi" }; $us_icon = { "icon" => "images/ftpusers.gif", "name" => $text{'ftpusers_title'}, "link" => "edit_ftpusers.cgi" }; &config_icons("root global", "edit_global.cgi?", $ft_icon, $us_icon); # Start virtual server list with default $conf = &get_config(); push(@vname, $text{'index_defserv'}); push(@vlink, "virt_index.cgi"); push(@vdesc, $text{'index_defdesc'}); push(@vaddr, $text{'index_any'}); push(@vserv, &def(&find_directive("ServerName", $conf), $text{'default'})); # Add other virtual servers @virt = &find_directive_struct("VirtualHost", $conf); foreach $v (@virt) { $vm = $v->{'members'}; push(@vname, $text{'index_virt'}); push(@vlink, "virt_index.cgi?virt=".&indexof($v, @$conf)); push(@vaddr, $v->{'value'}); $sname = &find_directive("ServerName", $vm); local $ip = &to_ipaddress($v->{'value'}); push(@vdesc, &text('index_vdesc', $ip ? $ip : $text{'index_eip'})); push(@vserv, &def(&find_vdirective("ServerName", $vm, $conf), $text{'index_auto'})); } # Show virtual servers print "
\n"; print "

$text{'index_virts'}

\n"; if ($config{'show_list'} && scalar(@vname)) { # as list for people with lots of servers print "\n"; print " ", " ", "\n"; for($i=0; $i<@vname; $i++) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "
$text{'index_type'}$text{'index_addr'}$text{'index_name'}
$vname[$i]$vaddr[$i]$vserv[$i]
\n"; } else { # as icons for niceness print "\n"; for($i=0; $i<@vname; $i++) { print "\n"; } print "
"; &generate_icon("images/virt.gif", $vname[$i], $vlink[$i]); print " \n"; print "$vdesc[$i]
\n"; print "\n"; print "\n"; print "\n"; print "
$text{'index_addr'} ", "$vaddr[$i]$text{'index_name'} ", "$vserv[$i]
\n"; } print "
\n"; print "\n"; print "\n"; print "
$text{'index_create'}
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'index_addr'}
$text{'index_port'}",&opt_input(undef, "Port", $text{'default'}, 6),"
$text{'index_name'}",&opt_input(undef, "ServerName", $text{'default'}, 25); print "  \n"; print "
\n"; print "
\n"; if (&foreign_check('inetd')) { # Check if proftpd is in inetd &foreign_require('inetd', 'inetd-lib.pl'); foreach $i (&foreign_call('inetd', 'list_inets')) { if ($i->[1] && $i->[3] eq 'ftp') { $inet = $i; last; } } $inet_mod = 'inetd'; } elsif (&foreign_check('xinetd')) { # Check if proftpd is in xinetd &foreign_require('xinetd', 'xinetd-lib.pl'); foreach $xi (&foreign_call("xinetd", "get_xinetd_config")) { if ($xi->{'quick'}->{'disable'}->[0] ne 'yes' && $xi->{'value'} eq 'ftp') { $inet = $xi; last; } } $inet_mod = 'xinetd'; } else { # Not supported on this OS .. assume so $inet = 1; } if (!$inet) { # Get the FTP server pid if (open(PID, $config{'pid_file'})) { chop($pid = ); close(PID); } $pid = undef if (!kill(0, $pid)); } if (!$inet && $pid) { print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'index_applymsg'}
\n"; } elsif (!$inet && !$pid) { print "
\n"; print "
\n"; print "\n"; print "\n"; if ($inet_mod) { print "\n"; } else { print "\n"; } print "
",&text('index_startmsg', "/$inet_mod/"),"$text{'index_startmsg2'}
\n"; } print "
\n"; &footer("/", $text{'index'}); proftpd/apply.cgi0100755000567100000120000000030207401421102014013 0ustar jcameronwheel#!/usr/local/bin/perl # apply.cgi # Apply config file changes with a HUP signal require './proftpd-lib.pl'; &ReadParse(); &kill_logged('HUP', $in{'pid'}); &webmin_log("apply"); &redirect(""); proftpd/mod_core.pl0100664000567100000120000011360707401421102014342 0ustar jcameronwheel# mod_core.pl # Core proftpd directives # mod_core_directives(version) # Returns a directive structure, like the one user by Apache. Types are : # 0 - Networking # 1 - Logging # 2 - Files # 3 - Access control # 4 - Misc # 5 - User and Group # 6 - Authentication sub mod_core_directives { local $rv = [ [ 'AccessDenyMsg', 0, 3, 'virtual anon global', 1.22 ], [ 'AccessGrantMsg', 0, 3, 'virtual anon global', 0.99 ], [ 'Allow Deny Order', 1, 3, 'limit', 0.99 ], [ 'AllowAll DenyAll', 0, 3, 'directory anon limit ftpaccess', 0.99 ], [ 'AllowFilter', 0, 3, 'virtual anon global', 1.20 ], [ 'AllowForeignAddress', 0, 0, 'virtual anon global', 1.17 ], [ 'AllowGroup', 0, 3, 'limit', 1.11 ], [ 'AllowOverwrite', 0, 3, 'virtual anon directory ftpaccess global', 0.99 ], [ 'AllowUser', 0, 3, 'limit', 1.17 ], [ 'AllowRetrieveRestart', 0, 0, 'virtual anon directory global ftpaccess', 0.99 ], [ 'AllowStoreRestart', 0, 0, 'virtual anon directory global ftpaccess', 0.99 ], [ 'AnonRequirePassword', 0, 6, 'anon', 0.99 ], [ 'AnonymousGroup', 0, 6, 'virtual global', 1.13 ], [ 'AuthAliasOnly', 0, 6, 'virtual anon global', 1.13 ], [ 'AuthUsingAlias', 0, 6, 'anon', 1.20 ], [ 'Bind', 0, 0, 'virtual', 1.16 ], [ 'CDPath', 1, 2, 'virtual anon global', 1.20 ], [ 'Class Classes', 1, 3, 'virtual', 1.20 ], [ 'CommandBufferSize', 0, 0, 'virtual global', 1.20 ], [ 'DefaultServer', 0, 0, 'virtual', undef, 0.99, 8 ], [ 'DefaultTransferMode', 0, 0, 'virtual global', 1.20 ], [ 'DeferWelcome', 0, 0, 'virtual global', 0.99 ], [ 'DeleteAbortedStores', 0, 2, 'virtual directory anon global ftpaccess', 1.20 ], [ 'DenyFilter', 0, 3, 'virtual anon global', 1.20 ], [ 'DenyGroup', 0, 3, 'limit', 1.11 ], [ 'DenyUser', 0, 3, 'limit', 1.17 ], [ 'DisplayConnect', 0, 6, 'virtual global', 1.20 ], [ 'DisplayFirstChdir', 0, 2, 'virtual anon directory global', 0.99 ], [ 'DisplayGoAway', 0, 6, 'virtual anon global', 1.20 ], [ 'DisplayLogin', 0, 6, 'virtual anon global', 0.99 ], [ 'DisplayQuit', 0, 6, 'virtual anon global', 1.20 ], [ 'Group', 0, 5, 'virtual anon', undef, 0.99, 9 ], [ 'GroupOwner', 0, 5, 'anon directory ftpaccess', 0.99 ], [ 'GroupPassword', 1, 6, 'virtual anon global', 0.99 ], [ 'HiddenStor', 0, 2, 'virtual anon directory global', 1.20 ], [ 'HideGroup', 1, 2, 'directory anon', 0.99 ], [ 'HideNoAccess', 0, 2, 'directory anon', 0.99 ], [ 'HideUser', 1, 2, 'directory anon', 0.99 ], [ 'IdentLookups', 0, 0, 'virtual global', 1.15 ], [ 'IgnoreHidden', 0, 2, 'limit', 0.99 ], [ 'MasqueradeAddress', 0, 0, 'virtual', 1.22 ], [ 'MaxClients', 0, 0, 'virtual anon global', 0.99 ], [ 'MaxClientsPerHost', 0, 0, 'virtual anon global', 1.17 ], [ 'MaxClientsPerUser', 0, 0, 'virtual anon global', 1.20 ], [ 'MaxInstances', 0, 0, 'root', undef, 1.16, 8 ], [ 'MaxLoginAttempts', 0, 6, 'virtual global', 0.99 ], [ 'MultilineRFC2228', 0, 0, 'root', 1.20 ], [ 'PassivePorts', 0, 0, 'virtual global', 1.20 ], [ 'PathAllowFilter', 0, 2, 'virtual anon global', 1.17 ], [ 'PathDenyFilter', 0, 2, 'virtual anon global', 1.17 ], [ 'PidFile', 0, 4, 'root', 1.20 ], [ 'Port', 0, 0, 'virtual', 0.99 ], [ 'RequireValidShell', 0, 6, 'virtual anon global', 0.99 ], [ 'RLimitCPU', 0, 4, 'root', 1.22 ], [ 'RLimitMemory', 0, 4, 'root', 1.22 ], [ 'RLimitOpenFiles', 0, 4, 'root', 1.22 ], [ 'ScoreboardPath', 0, 4, 'root', 1.16 ], [ 'ServerAdmin', 0, 4, 'virtual', 0.99 ], [ 'ServerIdent', 0, 0, 'virtual global', 1.20 ], [ 'ServerName', 0, 4, 'virtual', undef, 0.99, 11 ], [ 'ServerType', 0, 0, 'root', undef, 0.99, 10 ], [ 'ShowSymlinks', 0, 2, 'virtual anon global', 0.99 ], [ 'SocketBindTight', 0, 0, 'root', 0.99 ], [ 'SyslogFacility', 0, 1, 'root', 1.16 ], [ 'SyslogLevel', 0, 1, 'virtual anon global', 1.20 ], [ 'tcpBackLog', 0, 0, 'root', 0.99 ], [ 'tcpNoDelay', 0, 0, 'virtual global', 1.20 ], [ 'tcpReceiveWindow', 0, 0, 'virtual', 0.99 ], [ 'tcpSendWindow', 0, 0, 'virtual', 0.99 ], [ 'TimesGMT', 0, 4, 'root', 1.20 ], [ 'TimeoutIdle', 0, 0, 'root', 0.99 ], [ 'TimeoutLogin', 0, 0, 'root', 0.99 ], [ 'TimeoutNoTransfer', 0, 0, 'root', 0.99 ], [ 'TimeoutStalled', 0, 0, 'root', 1.16 ], [ 'TransferLog', 0, 1, 'virtual anon', undef, 1.14, 10 ], [ 'Umask', 0, 2, 'virtual directory ftpaccess', undef, 0.99, 3 ], [ 'UseFtpUsers', 0, 6, 'virtual anon global', 0.99 ], [ 'UseHostsAllowFile', 0, 3, 'virtual anon', 1.20 ], [ 'UseHostsDenyFile', 0, 3, 'virtual anon', 1.20 ], [ 'UseReverseDNS', 0, 0, 'root', 1.17 ], [ 'User', 0, 5, 'virtual anon', undef, 0.99, 10 ], [ 'UserDirRoot', 0, 2, 'anon', 1.20 ], [ 'UserAlias', 1, 6, 'virtual anon global', 0.99 ], [ 'UserOwner', 0, 5, 'anon directory', 1.20 ], [ 'UserPassword', 1, 6, 'virtual anon global', 0.99 ], [ 'WtmpLog', 0, 4, 'virtual anon global', 1.17 ], ]; return &make_directives($rv, $_[0], "mod_core"); } sub edit_AccessDenyMsg { return (1, $text{'mod_core_accessdeny'}, &opt_input($_[0]->{'value'}, "AccessDenyMsg", $text{'default'}, 20)); } sub save_AccessDenyMsg { return &parse_opt("AccessDenyMsg"); } sub edit_AccessGrantMsg { return (1, $text{'mod_core_accessgrant'}, &opt_input($_[0]->{'value'}, "AccessGrantMsg", $text{'default'}, 20)); } sub save_AccessGrantMsg { return &parse_opt("AccessGrantMsg"); } sub edit_Allow_Deny_Order { local (@type, @what, @mode, $i); foreach $d (@{$_[0]}, @{$_[1]}) { local @w = @{$d->{'words'}}; shift(@w) if (lc($w[0]) eq 'from'); for($i=0; $i<@w; $i++) { push(@type, lc($d->{'name'}) eq "allow" ? 1 : 2); push(@what, $w[$i] eq 'all' || $w[$i] eq 'none' ? undef : $w[$i]); if ($w[$i] eq 'all') { push(@mode, 0); } elsif ($w[$i] eq 'none') { push(@mode, 1); } elsif ($w[$i] =~ /^\d+\.\d+\.\d+\.\d+$/) { push(@mode, 2); } elsif ($w[$i] =~ /^[0-9\.\/]+$/) { push(@mode, 3); } else { push(@mode, 4); } } } push(@type, ""); push(@what, ""); push(@mode, 0); $rv = "$text{'mod_core_order'}\n". &choice_input($_[2]->[0]->{'value'}, "order", "", "$text{'mod_core_denyallow'},deny,allow", "$text{'mod_core_allowdeny'},allow,deny", "$text{'default'},")."
\n"; $rv .= "\n". " ". "\n"; @sels = map { $text{"mod_core_mode_$_"}.','.$_ } (0 .. 4); for($i=0; $i<@type; $i++) { $rv .= "\n"; $rv .= "\n", $mode[$i] ? $what[$i] : ""; $rv .= "\n"; } $rv .= "
$text{'mod_core_action'}$text{'mod_core_cond'}
".&select_input($type[$i], "allow_type_$i", "0", " ,0", "$text{'mod_core_allow'},1", "$text{'mod_core_deny'},2")."".&select_input($mode[$i], "allow_mode_$i", "0", @sels); $rv .= sprintf "
\n"; return (2, $text{'mod_core_allow_deny'}, $rv); } sub save_Allow_Deny_Order { local ($i, $type, $mode, $what, @allow, @deny); for($i=0; defined($type = $in{"allow_type_$i"}); $i++) { $mode = $in{"allow_mode_$i"}; $what = $in{"allow_what_$i"}; next if (!$type); if ($mode == 0) { $what = "all"; } elsif ($mode == 1) { $what = "none"; } elsif ($mode == 2) { &check_ipaddress($what) || &error(&text('mod_core_eip', $what)); } elsif ($mode == 3) { $what =~ /^[0-9\.]+\.$/ || $what =~ /^([0-9\.]+)\/\d+$/ && &check_ipaddress($1) || &error(&text('mod_core_enet', $what)); } elsif ($mode == 4) { $what =~ /^[A-Za-z0-9\.\-]+$/ || &error(&text('mod_core_ehost', $what)); } if ($type == 1) { push(@allow, $what); } else { push(@deny, $what); } } return ( \@allow, \@deny, &parse_choice("order", "")); } sub edit_AllowAll_DenyAll { #local $a = @{$_[0]}, $d = @{$_[1]}; local $a = $_[0], $d = $_[1]; local $rv = sprintf " %s\n", $a || $d ? "" : "checked", $text{'mod_core_addefault'}; $rv .= sprintf " %s\n", $a ? "checked" : "", $text{'mod_core_allowall'}; $rv .= sprintf " %s\n", $d ? "checked" : "", $text{'mod_core_denyall'}; return (1, $text{'mod_core_adall'}, $rv); } sub save_AllowAll_DenyAll { return $in{'AllowAll'} == 0 ? ( [ ], [ ] ) : $in{'AllowAll'} == 1 ? ( [ "" ], [ ] ) : ( [ ], [ "" ] ); } sub edit_AllowFilter { return (1, $text{'mod_core_filter'}, &opt_input($_[0]->{'value'}, "AllowFilter", $text{'default'}, 15)); } sub save_AllowFilter { return &parse_opt("AllowFilter"); } sub edit_AllowForeignAddress { return (1, $text{'mod_core_foreign'}, &choice_input($_[0]->{'value'}, "AllowForeignAddress", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AllowForeignAddress { return &parse_choice("AllowForeignAddress", ""); } sub edit_AllowGroup { return (2, $text{'mod_core_agroup'}, &opt_input($_[0]->{'value'}, "AllowGroup", $text{'mod_core_all'}, 50)); } sub save_AllowGroup { return &parse_opt("AllowGroup"); } sub edit_AllowOverwrite { return (1, $text{'mod_core_overwrite'}, &choice_input($_[0]->{'value'}, "AllowOverwrite", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AllowOverwrite { return &parse_choice("AllowOverwrite", ""); } sub edit_AllowRetrieveRestart { return (1, $text{'mod_core_restart'}, &choice_input($_[0]->{'value'}, "AllowRetrieveRestart", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AllowRetrieveRestart { return &parse_choice("AllowRetrieveRestart", ""); } sub edit_AllowStoreRestart { return (1, $text{'mod_core_restart2'}, &choice_input($_[0]->{'value'}, "AllowStoreRestart", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AllowStoreRestart { return &parse_choice("AllowStoreRestart", ""); } sub edit_AllowUser { return (2, $text{'mod_core_auser'}, &opt_input($_[0]->{'value'}, "AllowUser", $text{'mod_core_all'}, 50)); } sub save_AllowUser { return &parse_opt("AllowUser"); } sub edit_AnonRequirePassword { return (1, $text{'mod_core_require'}, &choice_input($_[0]->{'value'}, "AnonRequirePassword", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AnonRequirePassword { return &parse_choice("AnonRequirePassword", ""); } sub edit_AnonymousGroup { return (2, $text{'mod_core_anongroup'}, &opt_input($_[0]->{'value'}, "AnonymousGroup", $text{'default'}, 50)); } sub save_AnonymousGroup { return &parse_opt("AnonymousGroup", '\S', $text{'mod_core_eanongroup'}); } sub edit_AuthAliasOnly { return (1, $text{'mod_core_authalias'}, &choice_input($_[0]->{'value'}, "AuthAliasOnly", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AuthAliasOnly { return &parse_choice("AuthAliasOnly", ""); } sub edit_AuthUsingAlias { return (1, $text{'mod_core_authusingalias'}, &choice_input($_[0]->{'value'}, "AuthUsingAlias", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AuthUsingAlias { return &parse_choice("AuthUsingAlias", ""); } sub edit_Bind { return (1, $text{'mod_core_bind'}, &opt_input($_[0]->{'value'}, "Bind", $text{'mod_core_bind_all'}, 15)); } sub save_Bind { return &parse_opt("Bind", '^(\d+)\.(\d+)\.(\d+)\.(\d+)$', $text{'mod_core_ebind'}); } sub edit_CDPath { local $rv = "\n"; return (2, $text{'mod_core_cdpath'}, $rv); } sub save_CDPath { $in{'CDPath'} =~ s/\r//g; return ( [ split(/\s+/, $in{'CDPath'}) ] ); } sub edit_Class_Classes { local $rv = $text{'mod_core_classes'}. &choice_input($_[1]->[0]->{'value'}, "Classes", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")."
\n"; $rv .= "\n". " ". "\n"; local $i = 0; foreach $c (@{$_[0]}, { }) { local @w = @{$c->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $i++; } $rv .= "
$text{'mod_core_cname'}$text{'mod_core_ctype'}
\n"; $rv .= "
\n"; return (2, $text{'mod_core_cls'}, $rv); } sub save_Class_Classes { local ($i, @rv); for($i=0; defined($in{"Class_n_$i"}); $i++) { next if (!$in{"Class_n_$i"}); $in{"Class_t_$i"} ne 'limit' || $in{"Class_v_$i"} =~ /^\d+$/ || &error($text{'mod_core_eclimit'}); $in{"Class_t_$i"} ne 'regex' || $in{"Class_v_$i"} =~ /\S/ || &error($text{'mod_core_ecregex'}); $in{"Class_t_$i"} ne 'ip' || $in{"Class_v_$i"} =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)$/ || &error($text{'mod_core_ecip'}); push(@rv, join(" ", $in{"Class_n_$i"}, $in{"Class_t_$i"}, $in{"Class_v_$i"})); } return ( \@rv, $in{'Classes'} eq 'on' ? [ 'on' ] : $in{'Classes'} eq 'off' ? [ 'off' ] : [ ] ); } sub edit_CommandBufferSize { return (1, $text{'mod_core_buffer'}, &opt_input($_[0]->{'value'}, "CommandBufferSize", $text{'default'}, 5)); } sub save_CommandBufferSize { return &parse_opt("CommandBufferSize", '^\d+$', $text{'mod_core_ebuffer'}); } sub edit_DefaultServer { return (1, $text{'mod_core_defaultserver'}, &choice_input($_[0]->{'value'}, "DefaultServer", "off", "$text{'yes'},on", "$text{'no'},off")); } sub save_DefaultServer { return &parse_choice("DefaultServer", "off"); } sub edit_DefaultTransferMode { return (1, $text{'mod_core_transfer'}, &select_input($_[0]->{'value'}, "DefaultTransferMode", "", "$text{'mod_core_ascii'},ascii", "$text{'mod_core_binary'},binary", "$text{'default'},")); } sub save_DefaultTransferMode { return &parse_choice("DefaultTransferMode", ""); } sub edit_DeferWelcome { return (1, $text{'mod_core_defer'}, &choice_input($_[0]->{'value'}, "DeferWelcome", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_DeferWelcome { return &parse_choice("DeferWelcome", ""); } sub edit_DeleteAbortedStores { return (1, $text{'mod_core_aborted'}, &choice_input($_[0]->{'value'}, "DeleteAbortedStores", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_DeleteAbortedStores { return &parse_choice("DeleteAbortedStores", ""); } sub edit_DenyFilter { return (1, $text{'mod_core_dfilter'}, &opt_input($_[0]->{'value'}, "AllowFilter", $text{'default'}, 15)); } sub save_DenyFilter { return &parse_opt("AllowFilter"); } sub edit_DenyGroup { return (2, $text{'mod_core_dgroup'}, &opt_input($_[0]->{'value'}, "DenyGroup", $text{'mod_core_none'}, 50)); } sub save_DenyGroup { return &parse_opt("DenyGroup"); } sub edit_DenyUser { return (2, $text{'mod_core_duser'}, &opt_input($_[0]->{'value'}, "DenyUser", $text{'mod_core_none'}, 50)); } sub save_DenyUser { return &parse_opt("DenyUser"); } sub edit_DisplayConnect { return (2, $text{'mod_core_display'}, &opt_input($_[0]->{'value'}, "DisplayConnect", $text{'mod_core_none'}, 50)); } sub save_DisplayConnect { return &parse_opt("DisplayConnect", '\S', $text{'mod_core_edisplay'}); } sub edit_DisplayFirstChdir { return (1, $text{'mod_core_firstcd'}, &opt_input($_[0]->{'value'}, "DisplayFirstChdir", $text{'mod_core_none'}, 15)); } sub save_DisplayFirstChdir { return &parse_opt("DisplayFirstChdir", '^\S+$', $text{'mod_core_efirstcd'}); } sub edit_DisplayGoAway { return (2, $text{'mod_core_goaway'}, &opt_input($_[0]->{'value'}, "DisplayGoAway", $text{'mod_core_none'}, 50)); } sub save_DisplayGoAway { return &parse_opt("DisplayGoAway", '\S', $text{'mod_core_egoaway'}); } sub edit_DisplayLogin { return (2, $text{'mod_core_login'}, &opt_input($_[0]->{'value'}, "DisplayLogin", $text{'mod_core_none'}, 50)); } sub save_DisplayLogin { return &parse_opt("DisplayLogin", '\S', $text{'mod_core_elogin'}); } sub edit_DisplayQuit { return (2, $text{'mod_core_quit'}, &opt_input($_[0]->{'value'}, "DisplayQuit", $text{'mod_core_none'}, 50)); } sub save_DisplayQuit { return &parse_opt("DisplayQuit", '\S', $text{'mod_core_equit'}); } sub edit_Group { local($rv, @ginfo); $rv = sprintf " $text{'default'}\n", $_[0] ? "" : "checked"; $rv .= sprintf " %s\n", $_[0] && $_[0]->{'value'} !~ /^#/ ? "checked" : "", $text{'mod_core_gname'}; $rv .= sprintf " %s\n", $_[0]->{'value'} !~ /^#/ ? $_[0]->{'value'} : "", &group_chooser_button("Group_name", 0); $rv .= sprintf " %s\n", $_[0]->{'value'} =~ /^#/ ? "checked" : "", $text{'mod_core_gid'}; $rv .= sprintf "\n", $_[0]->{'value'} =~ /^#(.*)$/ ? $1 : ""; return (2, $text{'mod_core_group'}, $rv); } sub save_Group { if ($in{'Group'} == 0) { return ( [ ] ); } elsif ($in{'Group'} == 1) { return ( [ $in{'Group_name'} ] ); } elsif ($in{'Group_id'} !~ /^\-?\d+$/) { &error(&text('core_euid', $in{'Group_id'})); } else { return ( [ "#$in{'Group_id'}" ] ); } } sub edit_GroupOwner { return (1, $text{'mod_core_gowner'}, &opt_input($_[0]->{'value'}, "GroupOwner", $text{'default'}, 13, &group_chooser_button("GroupOwner"))); } sub save_GroupOwner { if ($in{'GroupOwner_def'}) { return ( [ ] ); } else { getgrnam($in{'GroupOwner'}) || &error($text{'mod_core_egowner'}); return ( [ $in{'GroupOwner'} ] ); } } sub edit_GroupPassword { local $rv = "\n"; $rv .= " ". "\n"; local $i = 0; foreach $g (@{$_[0]}) { local @v = @{$g->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $i++; } $rv .= "\n". "\n". "\n". "
$text{'mod_core_gpname'}$text{'mod_core_gppass'}
$text{'mod_core_gpdef'}\n"; $rv .= "\n"; $rv .= "
\n"; return (2, $text{'mod_core_grouppassword'}, $rv); } sub save_GroupPassword { local @rv; for($i=0; defined($in{"GroupPassword_n_$i"}); $i++) { next if (!$in{"GroupPassword_n_$i"}); scalar(getgrnam($in{"GroupPassword_n_$i"})) || &error($text{'mod_core_egpname'}); if ($in{"GroupPassword_d_$i"}) { push(@rv, $in{"GroupPassword_n_$i"}.' '. $in{"GroupPassword_d_$i"}); } else { $salt = substr(time(), 0, 2); push(@rv, $in{"GroupPassword_n_$i"}.' '. crypt($in{"GroupPassword_p_$i"}, $salt)); } } return ( \@rv ); } sub edit_HiddenStor { return (1, $text{'mod_core_hstor'}, &choice_input($_[0]->{'value'}, "HiddenStor", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_HiddenStor { return &parse_choice("HiddenStor", ""); } sub edit_HideGroup { return (2, $text{'mod_core_hgroup'}, sprintf "", join(" ", map { $_->{'value'} } @{$_[0]})); } sub save_HideGroup { local @hg = split(/\s+/, $in{'HideGroup'}); foreach $g (@hg) { scalar(getgrnam($g)) || &error($text{'mod_core_ehgroup'}); } return ( \@hg ); } sub edit_HideNoAccess { return (1, $text{'mod_core_hnoaccess'}, &choice_input($_[0]->{'value'}, "HideNoAccess", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_HideNoAccess { return &parse_choice("HideNoAccess", ""); } sub edit_HideUser { return (2, $text{'mod_core_huser'}, sprintf "", join(" ", map { $_->{'value'} } @{$_[0]})); } sub save_HideUser { local @hu = split(/\s+/, $in{'HideUser'}); foreach $u (@hu) { scalar(getpwnam($u)) || &error($text{'mod_core_ehuser'}); } return ( \@hg ); } sub edit_IdentLookups { return (1, $text{'mod_core_ident'}, &choice_input($_[0]->{'value'}, "IdentLookups", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_IdentLookups { return &parse_choice("IdentLookups", ""); } sub edit_IgnoreHidden { return (1, $text{'mod_core_ihidden'}, &choice_input($_[0]->{'value'}, "IgnoreHidden", "off", "$text{'yes'},on", "$text{'no'},off")); } sub save_IgnoreHidden { return &parse_choice("IgnoreHidden", "off"); } sub edit_MasqueradeAddress { return (2, $text{'mod_core_masq'}, &opt_input($_[0]->{'value'}, "MasqueradeAddress", $text{'mod_core_masq_def'}, 30)); } sub save_MasqueradeAddress { $in{'MasqueradeAddress_def'} || &to_ipaddress($in{'MasqueradeAddress'}) || &error($text{'mod_core_emasq'}); return &parse_opt("MasqueradeAddress"); } sub edit_MaxClients { return (2, $text{'mod_core_maxc'}, &edit_max($_[0], "MaxClients")); } sub save_MaxClients { return &save_max("MaxClients"); } sub edit_MaxClientsPerHost { return (2, $text{'mod_core_maxch'}, &edit_max($_[0], "MaxClientsPerHost")); } sub save_MaxClientsPerHost { return &save_max("MaxClientsPerHost"); } sub edit_MaxClientsPerUser { return (2, $text{'mod_core_maxcu'}, &edit_max($_[0], "MaxClientsPerUser")); } sub save_MaxClientsPerUser { return &save_max("MaxClientsPerUser"); } sub edit_max { local $m = !$_[0] ? 0 : $_[0]->{'words'}->[0] eq 'none' ? 1 : 2; local $rv = sprintf " %s\n", $m == 0 ? "checked" : "", $text{'default'}; $rv .= sprintf " %s\n", $m == 1 ? "checked" : "", $text{'mod_core_maxc1'}; $rv .= sprintf "\n", $m == 2 ? "checked" : ""; $rv .= sprintf "
\n", $m == 2 ? $_[0]->{'words'}->[0] : ""; $rv .= sprintf "%s \n", $text{'mod_core_maxcmsg'}, $_[0]->{'words'}->[1]; return $rv; } sub save_max { if ($in{"$_[0]_m"} == 0) { return ( [ ] ); } else { local $n; if ($in{"$_[0]_m"} == 1) { $n = "none"; } else { $in{$_[0]} =~ /^\d+$/ || &error($text{'mod_core_emaxc'}); $n = $in{$_[0]}; } if ($in{"$_[0]_t"}) { return ( [ "$n \"".$in{"$_[0]_t"}."\"" ] ); } else { return ( [ $n ] ); } } } sub edit_MaxInstances { return (1, $text{'mod_core_instances'}, &opt_input($_[0]->{'value'}, "MaxInstances", $text{'default'}, 4)); } sub save_MaxInstances { return &parse_opt("MaxInstances", '^\d+$', $text{'mod_core_einstances'}); } sub edit_MaxLoginAttempts { return (1, $text{'mod_core_logins'}, &opt_input($_[0]->{'value'}, "MaxLoginAttempts", $text{'default'}, 4)); } sub save_MaxLoginAttempts { return &parse_opt("MaxLoginAttempts", '^\d+$', $text{'mod_core_elogins'}); } sub edit_MultilineRFC2228 { return (1, $text{'mod_core_rfc2228'}, &choice_input($_[0]->{'value'}, "MultilineRFC2228", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_MultilineRFC2228 { return &parse_choice("MultilineRFC2228", ""); } sub edit_PassivePorts { local $rv = sprintf " %s\n", $_[0] ? "" : "checked", $text{'default'}; $rv .= sprintf " %s\n", $_[0] ? "checked" : "", $text{'mod_core_pasvr'}; $rv .= sprintf " -\n", $_[0]->{'words'}->[0]; $rv .= sprintf "\n", $_[0]->{'words'}->[1]; return (1, $text{'mod_core_pasv'}, $rv); } sub save_PassivePorts { if ($in{'PassivePorts_def'}) { return ( [ ] ); } else { $in{'PassivePorts_f'} =~ /^\d+$/ || &error($text{'mod_core_epasv'}); $in{'PassivePorts_t'} =~ /^\d+$/ || &error($text{'mod_core_epasv'}); return ( [ "$in{'PassivePorts_f'} $in{'PassivePorts_t'}" ] ); } } sub edit_PathAllowFilter { return (1, $text{'mod_core_pathallow'}, &opt_input($_[0]->{'words'}->[0], "PathAllowFilter", $text{'mod_core_any'}, 20)); } sub save_PathAllowFilter { return &parse_opt("PathAllowFilter"); } sub edit_PathDenyFilter { return (1, $text{'mod_core_pathdeny'}, &opt_input($_[0]->{'words'}->[0], "PathDenyFilter", $text{'mod_core_none'}, 20)); } sub save_PathDenyFilter { return &parse_opt("PathDenyFilter"); } sub edit_PidFile { return (2, $text{'mod_core_pidfile'}, &opt_input($_[0]->{'words'}->[0], "PidFile", $text{'default'}, 50, &file_chooser_button("PidFile"))); } sub save_PidFile { return &parse_opt("PidFile", '^\/\S+$', $text{'mod_core_epidfile'}); } sub edit_Port { return (1, $text{'mod_core_port'}, &opt_input($_[0]->{'value'}, "Port", $text{'default'}, 6)); } sub save_Port { return &parse_opt("Port", '^\d+$', $text{'mod_core_eport'}); } sub edit_RequireValidShell { return (1, $text{'mod_core_shell'}, &choice_input($_[0]->{'value'}, "RequireValidShell", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_RequireValidShell { return &parse_choice("RequireValidShell", ""); } sub edit_RLimitCPU { return &rlimit_input("RLimitCPU", $text{'mod_core_cpulimit'}, $_[0]); } sub save_RLimitCPU { return &parse_rlimit("RLimitCPU", $text{'mod_core_ecpulimit'}); } sub edit_RLimitMemory { return &rlimit_input("RLimitMemory", $text{'mod_core_memlimit'}, $_[0]); } sub save_RLimitMemory { return &parse_rlimit("RLimitMemory", $text{'mod_core_ememlimit'}); } sub edit_RLimitOpenFiles { return &rlimit_input("RLimitOpenFiles", $text{'mod_core_filelimit'}, $_[0]); } sub save_RLimitOpenFiles { return &parse_rlimit("RLimitOpenFiles", $text{'mod_core_efilelimit'}); } # rlimit_input(name, desc, value) sub rlimit_input { local @w = @{$_[2]->{'words'}}; local $rv; $rv .= sprintf "%s %s\n", $text{'mod_core_soft'}, $_[0], $w[0] ? "" : "checked", $text{'default'}; $rv .= sprintf " %s\n", $_[0], $w[0] eq 'max' ? "checked" : "", $text{'mod_core_max'}; $rv .= sprintf "\n", $_[0], !$w[0] || $w[0] eq 'max' ? "" : "checked"; $rv .= sprintf "\n", $_[0], $w[0] eq 'max' ? '' : $w[0]; $rv .= "   "; $rv .= sprintf "%s %s\n", $text{'mod_core_hard'}, $_[0], $w[1] ? "" : "checked", $text{'default'}; $rv .= sprintf " %s\n", $_[0], $w[1] eq 'max' ? "checked" : "", $text{'mod_core_max'}; $rv .= sprintf "\n", $_[0], !$w[1] || $w[1] eq 'max' ? "" : "checked"; $rv .= sprintf "\n", $_[0], $w[1] eq 'max' ? '' : $w[1]; return (2, $_[1], $rv); } # parse_rlimit(name, desc) sub parse_rlimit { if ($in{"$_[0]_smax"} == 2) { return ( [ ] ); } local @v; if ($in{"$_[0]_smax"} == 1) { push(@v, "max"); } else { $in{"$_[0]_soft"} =~ /^(\d+)(G|M|K|B)?$/i || &error(&text('mod_core_esoft', $_[1])); push(@v, $in{"$_[0]_soft"}); } if ($in{"$_[0]_hmax"} == 1) { push(@v, "max"); } elsif ($in{"$_[0]_hmax"} == 0) { $in{"$_[0]_hard"} =~ /^(\d+)(G|M|K|B)?$/i || &error(&text('mod_core_ehard', $_[1])); push(@v, $in{"$_[0]_hard"}); } return ( [ join(" ", @v) ] ); } sub edit_ScoreboardPath { return (2, $text{'mod_core_score'}, &opt_input($_[0]->{'words'}->[0], "ScoreboardPath", $text{'default'}, 50, &file_chooser_button("ScoreboardPath"))); } sub save_ScoreboardPath { return &parse_opt("ScoreboardPath", '^\/\S+$', $text{'mod_core_escore'}); } sub edit_ServerAdmin { return (2, $text{'mod_core_admin'}, &opt_input($_[0]->{'words'}->[0], "ServerAdmin", $text{'default'}, 40)); } sub save_ServerAdmin { return &parse_opt("ServerAdmin", '^\S+\@\S+$', $text{'mod_core_eadmin'}); } sub edit_ServerIdent { local @w = @{$_[0]->{'words'}}; local $rv = sprintf " %s\n", $_[0] ? "" : "checked", $text{'default'}; $rv .= sprintf " %s\n", lc($w[0]) eq 'off' ? "checked" : "", $text{'mod_core_none'}; $rv .= sprintf " %s\n", lc($w[0]) eq 'on' && !$w[1] ? "checked" : "", $text{'mod_core_identmsg_def'}; $rv .= sprintf "\n", lc($w[0]) eq 'on' && $w[1] ? "checked" : ""; $rv .= sprintf "\n", lc($w[0]) eq 'on' ? $w[1] : ""; return (2, $text{'mod_core_identmsg'}, $rv); } sub save_ServerIdent { if ($in{'ServerIdent_m'} == 0) { return ( [ ] ); } elsif ($in{'ServerIdent_m'} == 1) { return ( [ "off" ] ); } elsif ($in{'ServerIdent_m'} == 2) { return ( [ "on" ] ); } else { return ( [ "on $in{'ServerIdent'}" ] ); } } sub edit_ServerName { return (2, $text{'mod_core_servername'}, &opt_input($_[0]->{'words'}->[0], "ServerName", $text{'default'}, 50)); } sub save_ServerName { return &parse_opt("ServerName", '\S', $text{'mod_core_eservername'}); } sub edit_ServerType { return (1, $text{'mod_core_type'}, &select_input($_[0]->{'value'}, "ServerType", "", "$text{'mod_core_inetd'},inetd", "$text{'mod_core_stand'},standalone", "$text{'default'},")); } sub save_ServerType { return &parse_choice("ServerType", ""); } sub edit_ShowSymlinks { return (1, $text{'mod_core_links'}, &choice_input($_[0]->{'value'}, "ShowSymlinks", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_ShowSymlinks { return &parse_choice("ShowSymlinks", ""); } sub edit_SocketBindTight { return (1, $text{'mod_core_tight'}, &choice_input($_[0]->{'value'}, "SocketBindTight", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_SocketBindTight { return &parse_choice("SocketBindTight", ""); } sub edit_SyslogFacility { local @facils = map { "$_,$_" } ( 'auth', 'authpriv', 'cron', 'daemon', 'kern', 'lpr', 'mail', 'news', 'user', 'uucp', 'local0', 'local1', 'local2', 'local3', 'local4', 'local5', 'local6', 'local7' ); return (1, $text{'mod_core_facility'}, &select_input($_[0]->{'value'}, "SyslogFacility", "", "$text{'default'},", @facils)); } sub save_SyslogFacility { return &parse_select("SyslogFacility", ""); } sub edit_SyslogLevel { local @levels = map { "$_,$_" } ( 'emerg', 'alert', 'crit', 'error', 'warn', 'notice', 'info', 'debug' ); return (1, $text{'mod_core_level'}, &select_input($_[0]->{'value'}, "SyslogLevel", "", "$text{'default'},", @levels)); } sub save_SyslogLevel { return &parse_select("SyslogLevel", ""); } sub edit_TransferLog { return (2, $text{'mod_core_tlog'}, &opt_input($_[0]->{'value'}, "TransferLog", $text{'default'}, 50, &file_chooser_button("TransferLog"))); } sub save_TransferLog { return &parse_opt("TransferLog", '^(\/\S+)|NONE$', $text{'mod_core_etlog'}); } sub edit_tcpBackLog { return (1, $text{'mod_core_backlog'}, &opt_input($_[0]->{'value'}, "tcpBackLog", $text{'default'}, 6)); } sub save_tcpBackLog { return &parse_opt("tcpBackLog", '^\d+$', $text{'mod_core_ebacklog'}); } sub edit_tcpNoDelay { return (1, $text{'mod_core_nodelay'}, &choice_input($_[0]->{'value'}, "tcpNoDelay", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_tcpNoDelay { return &parse_choice("tcpNoDelay", ""); } sub edit_tcpReceiveWindow { return (1, $text{'mod_core_rwindow'}, &opt_input($_[0]->{'value'}, "tcpReceiveWindow", $text{'default'}, 6)); } sub save_tcpReceiveWindow { return &parse_opt("tcpReceiveWindow", '^\d+$', $text{'mod_core_erwindow'}); } sub edit_tcpSendWindow { return (1, $text{'mod_core_swindow'}, &opt_input($_[0]->{'value'}, "tcpSendWindow", $text{'default'}, 6)); } sub save_tcpSendWindow { return &parse_opt("tcpSendWindow", '^\d+$', $text{'mod_core_eswindow'}); } sub edit_TimesGMT { return (1, $text{'mod_core_gmt'}, &choice_input($_[0]->{'value'}, "TimesGMT", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_TimesGMT { return &parse_choice("TimesGMT", ""); } sub edit_TimeoutIdle { return (1, $text{'mod_core_tidle'}, &opt_input($_[0]->{'value'}, "TimeoutIdle", $text{'default'}, 6, $text{'mod_core_secs'})); } sub save_TimeoutIdle { return &parse_opt("TimeoutIdle", '^\d+$', $text{'mod_core_etidle'}); } sub edit_TimeoutLogin { return (1, $text{'mod_core_tlogin'}, &opt_input($_[0]->{'value'}, "TimeoutLogin", $text{'default'}, 6, $text{'mod_core_secs'})); } sub save_TimeoutLogin { return &parse_opt("TimeoutLogin", '^\d+$', $text{'mod_core_etlogin'}); } sub edit_TimeoutNoTransfer { return (1, $text{'mod_core_ttransfer'}, &opt_input($_[0]->{'value'}, "TimeoutNoTransfer", $text{'default'}, 6, $text{'mod_core_secs'})); } sub save_TimeoutNoTransfer { return &parse_opt("TimeoutNoTransfer", '^\d+$', $text{'mod_core_ettransfer'}); } sub edit_TimeoutStalled { return (1, $text{'mod_core_tstalled'}, &opt_input($_[0]->{'value'}, "TimeoutStalled", $text{'default'}, 6, $text{'mod_core_secs'})); } sub save_TimeoutStalled { return &parse_opt("TimeoutStalled", '^\d+$', $text{'mod_core_etstalled'}); } sub edit_Umask { return (1, $text{'mod_core_umask'}, &opt_input($_[0]->{'value'}, "Umask", $text{'default'}, 3)); } sub save_Umask { return &parse_opt("Umask", '^[0-7]{3}$', $text{'mod_core_eumask'}); } sub edit_UseFtpUsers { return (1, $text{'mod_core_ftpusers'}, &choice_input($_[0]->{'value'}, "UseFtpUsers", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_UseFtpUsers { return &parse_choice("UseFtpUsers", ""); } sub edit_UseHostsAllowFile { return (2, $text{'mod_core_hostsallow'}, &opt_input($_[0]->{'value'}, "UseHostsAllowFile", $text{'default'}, 50, &file_chooser_button("UseHostsAllowFile"))); } sub save_UseHostsAllowFile { $in{'UseHostsAllowFile_def'} || -r $in{'UseHostsAllowFile'} || &error($text{'mod_core_ehostsallow'}); return &parse_opt("UseHostsAllowFile"); } sub edit_UseHostsDenyFile { return (2, $text{'mod_core_hostsdeny'}, &opt_input($_[0]->{'value'}, "UseHostsDenyFile", $text{'default'}, 50, &file_chooser_button("UseHostsDenyFile"))); } sub save_UseHostsDenyFile { $in{'UseHostsDenyFile_def'} || -r $in{'UseHostsDenyFile'} || &error($text{'mod_core_ehostsdeny'}); return &parse_opt("UseHostsDenyFile"); } sub edit_UseReverseDNS { return (1, $text{'mod_core_revdns'}, &choice_input($_[0]->{'value'}, "UseReverseDNS", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_UseReverseDNS { return &parse_choice("UseReverseDNS", ""); } sub edit_UserDirRoot { return (1, $text{'mod_core_userdir'}, &choice_input($_[0]->{'value'}, "UserDirRoot", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_UserDirRoot { return &parse_choice("UserDirRoot", ""); } sub edit_User { local($rv, @uinfo); $rv = sprintf " $text{'default'}\n", $_[0] ? "" : "checked"; $rv .= sprintf " %s\n", $_[0] && $_[0]->{'value'} !~ /^#/ ? "checked" : "", $text{'mod_core_uname'}; $rv .= sprintf " %s \n", $_[0]->{'value'} !~ /^#/ ? $_[0]->{'value'} : "", &user_chooser_button("User_name", 0); $rv .= sprintf " %s\n", $_[0]->{'value'} =~ /^#/ ? "checked" : "", $text{'mod_core_uid'}; $rv .= sprintf "\n", $_[0]->{'value'} =~ /^#(.*)$/ ? $1 : ""; return (2, $text{'mod_core_user'}, $rv); } sub save_User { if ($in{'User'} == 0) { return ( [ ] ); } elsif ($in{'User'} == 1) { return ( [ $in{'User_name'} ] ); } elsif ($in{'User_id'} !~ /^\-?\d+$/) { &error(&text('core_egid', $in{'User_id'})); } else { return ( [ "#$in{'User_id'}" ] ); } } sub edit_UserAlias { local $rv = "\n". " ". "\n"; local $i = 0; foreach $u (@{$_[0]}, { }) { local @w = @{$u->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $i++; } $rv .= "
$text{'mod_core_afrom'}$text{'mod_core_ato'}
\n"; return (2, $text{'mod_core_ualias'}, $rv); } sub save_UserAlias { local @rv; for($i=0; defined($in{"UserAlias_f_$i"}); $i++) { next if (!$in{"UserAlias_f_$i"}); $in{"UserAlias_f_$i"} =~ /^\S+$/ || &error($text{'mod_core_eafrom'}); $in{"UserAlias_t_$i"} =~ /^\S+$/ || &error($text{'mod_core_eato'}); push(@rv, $in{"UserAlias_f_$i"}.' '.$in{"UserAlias_t_$i"}); } return ( \@rv ); } sub edit_UserOwner { return (1, $text{'mod_core_uowner'}, &opt_input($_[0]->{'value'}, "UserOwner", $text{'default'}, 13, &user_chooser_button("UserOwner"))); } sub save_UserOwner { if ($in{'UserOwner_def'}) { return ( [ ] ); } else { getpwnam($in{'UserOwner'}) || &error($text{'mod_core_euowner'}); return ( [ $in{'UserOwner'} ] ); } } sub edit_UserPassword { local $rv = "\n"; $rv .= " ". "\n"; local $i = 0; foreach $u (@{$_[0]}) { local @v = @{$u->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $i++; } $rv .= "\n". "\n". "\n". "
$text{'mod_core_upname'}$text{'mod_core_uppass'}
$text{'mod_core_updef'}\n"; $rv .= "\n"; $rv .= "
\n"; return (2, $text{'mod_core_userpassword'}, $rv); } sub save_UserPassword { local @rv; for($i=0; defined($in{"UserPassword_n_$i"}); $i++) { next if (!$in{"UserPassword_n_$i"}); scalar(getgrnam($in{"UserPassword_n_$i"})) || &error($text{'mod_core_eupname'}); if ($in{"UserPassword_d_$i"}) { push(@rv, $in{"UserPassword_n_$i"}.' '. $in{"UserPassword_d_$i"}); } else { $salt = substr(time(), 0, 2); push(@rv, $in{"UserPassword_n_$i"}.' '. crypt($in{"UserPassword_p_$i"}, $salt)); } } return ( \@rv ); } sub edit_WtmpLog { return (1, $text{'mod_core_wtmp'}, &choice_input($_[0]->{'value'}, "WtmpLog", "", "$text{'yes'},on", "$text{'no'},off", "$text{'mod_core_none'},NONE", "$text{'default'},")); } sub save_WtmpLog { return &parse_choice("WtmpLog", ""); } proftpd/edit_net.cgi0100775000567100000120000000134607401421102014474 0ustar jcameronwheel#!/usr/local/bin/perl # edit_net.cgi # Display networking options require './proftpd-lib.pl'; &header($text{'net_title'}, ""); print "
\n"; $conf = &get_config(); print "
\n"; print "\n"; print "\n"; print "
$text{'net_header'}
\n"; print "\n"; print &choice_input($text{'net_type'}, 'ServerType', $conf, 'inetd', $text{'net_inetd'}, 'inetd', $text{'net_stand'}, 'standalone'); print &text_input($text{'net_port'}, 'Port', $conf, '21', 6); print "\n"; print "
\n"; print "
\n"; print "
\n"; &footer("", $text{'index_return'}); proftpd/save_global.cgi0100755000567100000120000000160607401421102015154 0ustar jcameronwheel#!/usr/local/bin/perl # save_global.cgi # Save some type of global options require './proftpd-lib.pl'; &ReadParse(); &lock_proftpd_files(); $conf = &get_config(); $global = &find_directive_struct("Global", $conf); if ($global) { $gconf = $global->{'members'}; } else { # Need to create the global section .. local $lref = &read_file_lines($config{'proftpd_conf'}); push(@$lref, "", ""); &flush_file_lines(); undef(@get_config_cache); $conf = &get_config(); $global = &find_directive_struct("Global", $conf); $gconf = $global->{'members'}; } @edit = &editable_directives($in{'type'}, 'root'); @gedit = &editable_directives($in{'type'}, 'global'); &error_setup(&text('efailed', $text{"type_$in{'type'}"})); &parse_inputs(\@edit, $conf, $conf); &parse_inputs(\@gedit, $gconf, $conf); &unlock_proftpd_files(); &webmin_log("global", $in{'type'}, undef, \%in); &redirect(""); proftpd/edit_global.cgi0100775000567100000120000000172407401421102015146 0ustar jcameronwheel#!/usr/local/bin/perl # edit_global.cgi # Display a form for editing some kind of global options require './proftpd-lib.pl'; &ReadParse(); $conf = &get_config(); $global = &find_directive_struct("Global", $conf); if ($global) { $gconf = $global->{'members'}; } &header($text{"type_$in{'type'}"}, ""); print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
",$text{"type_$in{'type'}"},"
\n"; @dirs = &editable_directives($in{'type'}, 'root'); &generate_inputs(\@dirs, $conf); @gdirs = &editable_directives($in{'type'}, 'global'); if (@dirs && @gdirs) { print "\n"; } &generate_inputs(\@gdirs, $gconf); print "


\n"; print "
\n"; print "
\n"; &footer("", $text{'index_return'}); proftpd/edit_virt.cgi0100755000567100000120000000175507401421102014674 0ustar jcameronwheel#!/usr/local/bin/perl # edit_virt.cgi # Display a form for editing some kind of per-server options require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); @dirs = &editable_directives($in{'type'}, 'virtual'); &header($text{"type_$in{'type'}"}, ""); print "
", $in{'virt'} eq '' ? $text{'virt_header2'} : &text('virt_header1', $v->{'value'}),"
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
",&text('virt_header3', $text{"type_$in{'type'}"}), "
\n"; &generate_inputs(\@dirs, $conf); print "

\n"; print "
\n"; print "
\n"; &footer("virt_index.cgi?virt=$in{'virt'}", $text{'virt_return'}); proftpd/virt_index.cgi0100775000567100000120000000544407401421102015057 0ustar jcameronwheel#!/usr/local/bin/perl # virt_index.cgi # Display a menu for some specific virtual server, or the default server require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); &header($text{'virt_title'}, ""); # Display header and icons print "
", $in{'virt'} eq '' ? $text{'virt_header2'} : &text('virt_header1', $v->{'value'}),"
\n"; print "
\n"; print "

$text{'virt_opts'}

\n"; $anon_icon = { "icon" => "images/anon.gif", "name" => $text{'virt_anon'}, "link" => "anon_index.cgi?virt=$in{'virt'}" }; $virt_icon = { "icon" => "images/virt.gif", "name" => $text{'virt_virt'}, "link" => "edit_vserv.cgi?virt=$in{'virt'}" }; $ed_icon = { "icon" => "images/edit.gif", "name" => $text{'virt_edit'}, "link" => "manual_form.cgi?virt=$in{'virt'}" }; &config_icons("virtual", "edit_virt.cgi?virt=$in{'virt'}&", $anon_icon, $in{'virt'} ? ( $virt_icon, $ed_icon ) : ( ) ); # Display per-directory/limit options @dir = ( &find_directive_struct("Directory", $conf) , &find_directive_struct("Limit", $conf) ); if (@dir) { print "
\n"; print "

$text{'virt_header'}

\n"; print "\n"; foreach $d (@dir) { if ($i%3 == 0) { print "\n"; } print "\n"; if ($i++%3 == 2) { print "\n"; } } while($i++%3) { print "\n"; } print "
\n"; if ($d->{'name'} eq 'Limit') { &generate_icon("images/limit.gif", &text('virt_limit', $d->{'value'}), "limit_index.cgi?limit=".&indexof($d, @$conf). "&virt=$in{'virt'}"); } else { &generate_icon("images/dir.gif", &text('virt_dir', $d->{'value'}), "dir_index.cgi?idx=".&indexof($d, @$conf). "&virt=$in{'virt'}"); } print "
\n"; } print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
$text{'virt_adddir'}
\n"; print "\n"; print "\n"; print "
$text{'virt_path'}\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "
$text{'virt_addlimit'}
\n"; print "\n"; print "\n"; print "
$text{'virt_cmds'}\n"; print "
\n"; print "
\n"; print "
\n"; &footer("", $text{'index_return'}); proftpd/save_virt.cgi0100755000567100000120000000076607401421102014706 0ustar jcameronwheel#!/usr/local/bin/perl # save_virt.cgi # Save some kind of per-server configuration require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); @edit = &editable_directives($in{'type'}, 'virtual'); &lock_proftpd_files(); &error_setup(&text('efailed', $text{"type_$in{'type'}"})); &parse_inputs(\@edit, $conf, &get_config()); &unlock_proftpd_files(); &webmin_log("virt", $in{'type'}, $in{'virt'} ? $v->{'value'} : "", \%in); &redirect("virt_index.cgi?virt=$in{'virt'}"); proftpd/mod_ls.pl0100664000567100000120000000317507401421102014026 0ustar jcameronwheel# mod_ls.pl sub mod_ls_directives { local $rv = [ [ 'DirFakeGroup', 0, 2, 'virtual anon global', 1.15 ], [ 'DirFakeMode', 0, 2, 'virtual anon global', 1.16 ], [ 'DirFakeUser', 0, 2, 'virtual anon global', 1.15 ], [ 'LsDefaultOptions', 0, 2, 'virtual anon global', 1.16 ], [ 'ShowDotFiles', 0, 2, 'virtual anon global', 0.99 ], ]; return &make_directives($rv, $_[0], "mod_ls"); } sub edit_DirFakeGroup { return (1, $text{'mod_ls_fakegroup'}, &choice_input($_[0]->{'value'}, "DirFakeGroup", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_DirFakeGroup { return &parse_choice("DirFakeGroup", ""); } sub edit_DirFakeUser { return (1, $text{'mod_ls_fakeuser'}, &choice_input($_[0]->{'value'}, "DirFakeUser", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_DirFakeUser { return &parse_choice("DirFakeUser", ""); } sub edit_DirFakeMode { return (1, $text{'mod_ls_fakemode'}, &choice_input($_[0]->{'value'}, "DirFakeMode", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_DirFakeMode { return &parse_choice("DirFakeMode", ""); } sub edit_LsDefaultOptions { return (1, $text{'mod_ls_ls'}, &opt_input($_[0]->{'value'}, "LsDefaultOptions", $text{'default'}, 20)); } sub save_LsDefaultOptions { return &parse_opt("LsDefaultOptions", '\S', $text{'mod_ls_els'}); } sub edit_ShowDotFiles { return (1, $text{'mod_ls_dotfiles'}, &choice_input($_[0]->{'value'}, "ShowDotFiles", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_ShowDotFiles { return &parse_choice("ShowDotFiles", ""); } proftpd/anon_index.cgi0100775000567100000120000000541407401421102015023 0ustar jcameronwheel#!/usr/local/bin/perl # anon_index.cgi # Display a menu for anonymous section options require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); $anonstr = &find_directive_struct("Anonymous", $conf); if (!$anonstr) { # Go to the anon options page &redirect("edit_aserv.cgi?virt=$in{'virt'}&init=1"); exit; } $anon = $anonstr->{'members'}; # Display header and config icons &header($text{'anon_title'}, ""); print "
", $in{'virt'} eq '' ? $text{'anon_header2'} : &text('anon_header1', $v->{'value'}),"
\n"; print "
\n"; print "

$text{'anon_opts'}

\n"; $anon_icon = { "icon" => "images/anon.gif", "name" => $text{'anon_anon'}, "link" => "edit_aserv.cgi?virt=$in{'virt'}" }; &config_icons("anon", "edit_anon.cgi?virt=$in{'virt'}&", $anon_icon); # Display per-directory/limit options @dir = ( &find_directive_struct("Directory", $anon) , &find_directive_struct("Limit", $anon) ); if (@dir) { print "
\n"; print "

$text{'virt_header'}

\n"; print "\n"; foreach $d (@dir) { if ($i%3 == 0) { print "\n"; } print "\n"; if ($i++%3 == 2) { print "\n"; } } while($i++%3) { print "\n"; } print "
\n"; if ($d->{'name'} eq 'Limit') { &generate_icon("images/limit.gif", &text('virt_limit', $d->{'value'}), "limit_index.cgi?virt=$in{'virt'}&anon=1&limit=". &indexof($d, @$anon)); } else { &generate_icon("images/dir.gif", &text('virt_dir', $d->{'value'}), "dir_index.cgi?virt=$in{'virt'}&anon=1&idx=". &indexof($d, @$anon)); } print "
\n"; } print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'virt_adddir'}
\n"; print "\n"; print "\n"; print "
$text{'virt_path'}\n"; print "
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'virt_addlimit'}
\n"; print "\n"; print "\n"; print "
$text{'virt_cmds'}\n"; print "
\n"; print "
\n"; print "
\n"; &footer("", $text{'virt_return'}); proftpd/save_vserv.cgi0100775000567100000120000000274207401421102015065 0ustar jcameronwheel#!/usr/local/bin/perl # save_vserv.cgi # Save virtual server options such as the port and address require './proftpd-lib.pl'; &ReadParse(); $conf = &get_config(); $vconf = $conf->[$in{'virt'}]; if ($in{'delete'}) { # Delete a virtual server &lock_file($vconf->{'file'}); $lref = &read_file_lines($vconf->{'file'}); splice(@$lref, $vconf->{'line'}, $vconf->{'eline'} - $vconf->{'line'} + 1); &flush_file_lines(); &unlock_file($vconf->{'file'}); &webmin_log("virt", "delete", $vconf->{'value'}); &redirect(""); } else { # Update virtual server and directives &error_setup($text{'vserv_err'}); # Check inputs gethostbyname($in{'addr'}) || &to_ipaddress($in{'addr'}) || &error($text{'vserv_eaddr'}); $in{'Port_def'} || $in{'Port'} =~ /^\d+$/ || &error($text{'vserv_eport'}); $in{'ServerName_def'} || $in{'ServerName'} =~ /\S/ || &error($text{'vserv_ename'}); # Update directive &lock_file($vconf->{'file'}); $lref = &read_file_lines($vconf->{'file'}); $lref->[$vconf->{'line'}] = ""; # Update DocumentRoot and ServerName &save_directive("ServerName", $in{'ServerName_def'} ? [ ] : [ "\"$in{'ServerName'}\"" ], $vconf->{'members'}, $conf); &save_directive("Port", $in{'Port_def'} ? [ ] : [ $in{'Port'} ], $vconf->{'members'}, $conf); # write out file &flush_file_lines(); &unlock_file($vconf->{'file'}); &webmin_log("virt", "save", $vconf->{'value'}, \%in); &redirect("virt_index.cgi?virt=$in{'virt'}"); } proftpd/edit_vserv.cgi0100775000567100000120000000260007401421102015045 0ustar jcameronwheel#!/usr/local/bin/perl # edit_vserv.cgi # Edit section details require './proftpd-lib.pl'; &ReadParse(); $vconf = &get_config()->[$in{'virt'}]; &header($text{'vserv_title'}, ""); print "
", &text('virt_header1', $vconf->{'value'}), "
\n"; print "
\n"; $name = &find_directive("ServerName", $vconf->{'members'}); $port = &find_directive("Port", $vconf->{'members'}); print "
\n"; print "\n"; print "\n"; print "\n"; print "
$text{'vserv_title'}
\n"; print "\n"; printf "\n", $vconf->{'value'}; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'vserv_addr'}
$text{'vserv_name'}",&opt_input($name, "ServerName", $text{'default'}, 30), "
$text{'vserv_port'}",&opt_input($port, "Port", $text{'default'}, 6), "
\n"; print "\n"; print "\n"; print "

\n"; print "

\n"; print "
\n"; &footer("virt_index.cgi?virt=$in{'virt'}", $text{'virt_return'}); proftpd/edit_aserv.cgi0100775000567100000120000000345607401421102015032 0ustar jcameronwheel#!/usr/local/bin/perl # edit_aserv.cgi # Edit section details require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); if (!$in{'init'}) { $anon = &find_directive_struct("Anonymous", $conf); &header($text{'aserv_title'}, ""); } else { &header($text{'aserv_create'}, ""); } print "
", $in{'virt'} eq '' ? $text{'anon_header2'} : &text('anon_header1', $v->{'value'}),"
\n"; print "
\n"; print $text{'aserv_desc'},"
\n" if ($in{'init'}); $user = &find_directive("User", $anon->{'members'}); $group = &find_directive("Group", $anon->{'members'}); print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'aserv_title'}
\n"; print "\n"; printf "\n", $anon->{'value'}, &file_chooser_button("root", 1); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'aserv_root'} %s
$text{'aserv_user'}",&opt_input($user, "User", $text{'default'}, 13), "
$text{'aserv_group'}",&opt_input($group, "Group", $text{'default'}, 13), "
\n"; if ($in{'init'}) { print "\n"; } else { print "\n"; } print "

\n"; print "

\n"; print "
\n"; if ($in{'init'}) { &footer("virt_index.cgi?virt=$in{'virt'}", $text{'virt_return'}); } else { &footer("anon_index.cgi?virt=$in{'virt'}", $text{'anon_return'}); } proftpd/edit_anon.cgi0100755000567100000120000000207207401421102014634 0ustar jcameronwheel#!/usr/local/bin/perl # edit_anon.cgi # Display a form for editing some kind of anonymous option require './proftpd-lib.pl'; &ReadParse(); ($vconf, $v) = &get_virtual_config($in{'virt'}); $anon = &find_directive_struct("Anonymous", $vconf); $conf = $anon->{'members'}; @dirs = &editable_directives($in{'type'}, 'anon'); &header($text{"type_$in{'type'}"}, ""); print "
", $in{'virt'} eq '' ? $text{'anon_header4'} : &text('anon_header3', $v->{'value'}),"
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
",&text('virt_header3', $text{"type_$in{'type'}"}), "
\n"; &generate_inputs(\@dirs, $conf); print "

\n"; print "
\n"; print "
\n"; &footer("anon_index.cgi?virt=$in{'virt'}", $text{'virt_return'}); proftpd/save_aserv.cgi0100775000567100000120000000267407401421103015045 0ustar jcameronwheel#!/usr/local/bin/perl # save_aserv.cgi # Save anonymous section options require './proftpd-lib.pl'; &ReadParse(); $conf = &get_config(); if ($in{'virt'}) { $virt = $conf->[$in{'virt'}]; $vconf = $virt->{'members'}; } else { $vconf = $conf; } &error_setup($text{'aserv_err'}); # Validate inputs -d $in{'root'} || $in{'root'} =~ /^~/ || &error($text{'aserv_eroot'}); $in{'User_def'} || scalar(getpwnam($in{'User'})) || &error($text{'aserv_euser'}); $in{'Group_def'} || scalar(getgrnam($in{'Group'})) || &error($text{'aserv_egroup'}); if ($in{'init'}) { # Create a new directive $l = $vconf->[@$vconf - 1]; &lock_file($l->{'file'}); $lref = &read_file_lines($l->{'file'}); local @l = ( "" ); push(@l, "User $in{'User'}") if (!$in{'User_def'}); push(@l, "Group $in{'Group'}") if (!$in{'Group_def'}); push(@l, ""); splice(@$lref, $l->{'line'}+1, 0, @l); &unlock_file($l->{'file'}); } else { # Update existing directive $anon = &find_directive_struct("Anonymous", $vconf); &lock_file($anon->{'file'}); $lref = &read_file_lines($anon->{'file'}); $lref->[$anon->{'line'}] = ""; &save_directive("User", $in{'User_def'} ? [ ] : [ $in{'User'} ], $anon->{'members'}, $vconf); &save_directive("Group", $in{'Group_def'} ? [ ] : [ $in{'Group'} ], $anon->{'members'}, $vconf); &unlock_file($anon->{'file'}); } &flush_file_lines(); &redirect("anon_index.cgi?virt=$in{'virt'}"); proftpd/save_anon.cgi0100755000567100000120000000113007401421103014640 0ustar jcameronwheel#!/usr/local/bin/perl # save_anon.cgi # Save some kind of anonymous section configuration require './proftpd-lib.pl'; &ReadParse(); ($vconf, $v) = &get_virtual_config($in{'virt'}); $anon = &find_directive_struct("Anonymous", $vconf); $conf = $anon->{'members'}; @edit = &editable_directives($in{'type'}, 'anon'); &lock_file($anon->{'file'}); &error_setup(&text('efailed', $text{"type_$in{'type'}"})); &parse_inputs(\@edit, $conf, &get_config()); &unlock_file($anon->{'file'}); &webmin_log("anon", $in{'type'}, $in{'virt'} ? $v->{'value'} : "", \%in); &redirect("anon_index.cgi?virt=$in{'virt'}"); proftpd/create_virt.cgi0100775000567100000120000000170407401421103015207 0ustar jcameronwheel#!/usr/local/bin/perl # create_virt.cgi # Create a new virtual server require './proftpd-lib.pl'; &ReadParse(); $conf = &get_config(); &error_setup($text{'vserv_err'}); # Validate inputs $in{'addr_def'} || gethostbyname($in{'addr'}) || &check_ipaddress($in{'addr'}) || &error($text{'vserv_eaddr'}); $in{'Port_def'} || $in{'Port'} =~ /^\d+$/ || &error($text{'vserv_eport'}); $in{'ServerName_def'} || $in{'ServerName'} =~ /\S/ || &error($text{'vserv_ename'}); # Add the virtual host $l = $conf->[@$conf - 1]; &lock_file($l->{'file'}); $lref = &read_file_lines($l->{'file'}); @lines = ( "" ); push(@lines, "Port $in{'Port'}") if (!$in{'Port_def'}); push(@lines, "ServerName \"$in{'ServerName'}\"") if (!$in{'ServerName_def'}); push(@lines, ""); push(@$lref, @lines); &flush_file_lines(); &unlock_file($l->{'file'}); &webmin_log("virt", "create", $in{'addr'}, \%in); &redirect("virt_index.cgi?virt=".scalar(@$conf)); proftpd/manual_save.cgi0100775000567100000120000000433707401421103015200 0ustar jcameronwheel#!/usr/local/bin/perl # manual_save.cgi # Save manually entered directives require './proftpd-lib.pl'; &ReadParseMime(); if (defined($in{'virt'})) { if (defined($in{'limit'})) { # limit, maybe within a directory ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $conf = $conf->[$in{'idx'}]->{'members'}; } $l = $conf->[$in{'limit'}]; $file = $l->{'file'}; $return = "limit_index.cgi"; $start = $l->{'line'}+1; $end = $l->{'eline'}-1; $logtype = 'limit'; $logname = $l->{'value'}; } elsif (defined($in{'idx'})) { # directory within virtual server ($vconf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $vconf); $vconf = $anon->{'members'}; } $d = $vconf->[$in{'idx'}]; $file = $d->{'file'}; $return = "dir_index.cgi"; $start = $d->{'line'}+1; $end = $d->{'eline'}-1; $logtype = 'dir'; $logname = "$v->{'value'}:$d->{'words'}->[0]"; } else { # virtual server ($conf, $v) = &get_virtual_config($in{'virt'}); $return = "virt_index.cgi"; $file = $v->{'file'}; $start = $v->{'line'}+1; $end = $v->{'eline'}-1; $logtype = 'virt'; $logname = $v->{'words'}->[0]; } } else { if (defined($in{'limit'})) { # files within .htaccess file $hconf = &get_ftpaccess_config($in{'file'}); $l = $hconf->[$in{'limit'}]; $file = $in{'file'}; $return = "limit_index.cgi"; $start = $l->{'line'}+1; $end = $l->{'eline'}-1; $logtype = 'limit'; $logname = $l->{'value'}; } else { # .htaccess file $file = $in{'file'}; $return = "ftpaccess_index.cgi"; $logtype = 'ftpaccess'; $logname = $in{'file'}; } } &lock_file($file); $in{'directives'} =~ s/\r//g; $in{'directives'} =~ s/\s+$//; @dirs = split(/\n/, $in{'directives'}); $lref = &read_file_lines($file); if (!defined($start)) { $start = 0; $end = @$lref - 1; } splice(@$lref, $start, $end-$start+1, @dirs); &flush_file_lines(); &unlock_file($file); &webmin_log($logtype, "manual", $logname, \%in); foreach $h ('virt', 'idx', 'file', 'limit', 'anon') { push(@args, "$h=$in{$h}") if (defined($in{$h})); } &redirect("$return?".join("&", @args)); proftpd/manual_form.cgi0100775000567100000120000000602207401421103015176 0ustar jcameronwheel#!/usr/local/bin/perl # manual.cgi # Display a text box for manually editing directives require './proftpd-lib.pl'; &ReadParse(); &header($text{'manual_title'}, ""); if (defined($in{'virt'})) { if (defined($in{'limit'})) { # limit, maybe within a directory ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $dir = $conf->[$in{'idx'}]; $conf = $dir->{'members'}; } $l = $conf->[$in{'limit'}]; $ln = $l->{'value'}; $title = $dir ? &text('limit_header4', $ln, $dir->{'words'}->[0]) : $in{'virt'} ? &text('limit_header1', $ln, $v->{'words'}->[0]) : &text('limit_header2', $ln); $return = "limit_index.cgi"; $rmsg = $text{'limit_return'}; $file = $l->{'file'}; $start = $l->{'line'}+1; $end = $l->{'eline'}-1; } elsif (defined($in{'idx'})) { # directory within virtual server ($vconf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $vconf); $vconf = $anon->{'members'}; } $d = $vconf->[$in{'idx'}]; $dn = $d->{'words'}->[0]; $title = $in{'anon'} ? &text('dir_header4', $dn) : $in{'virt'} ? &text('dir_header1', $dn, $v->{'words'}->[0]) : &text('dir_header2', $dn); $return = "dir_index.cgi"; $rmsg = $text{'dir_return'}; $file = $d->{'file'}; $start = $d->{'line'}+1; $end = $d->{'eline'}-1; } else { # virtual server ($conf, $v) = &get_virtual_config($in{'virt'}); $title = $in{'virt'} eq '' ? $text{'virt_header2'} : &text('virt_header1', $v->{'value'}); $return = "virt_index.cgi"; $rmsg = $text{'virt_return'}; $file = $v->{'file'}; $start = $v->{'line'}+1; $end = $v->{'eline'}-1; } } else { if (defined($in{'limit'})) { # limit within .ftpaccess file $hconf = &get_ftpaccess_config($in{'file'}); $l = $hconf->[$in{'limit'}]; $file = $in{'file'}; $start = $l->{'line'}+1; $end = $l->{'eline'}-1; $title = &text('limit_header6', $l->{'value'}, "$in{'file'}"); $return = "limit_index.cgi"; $rmsg = $text{'limit_return'}; } else { # .ftpaccess file $file = $in{'file'}; $title = &text('ftpindex_header', "$in{'file'}"); $return = "ftpaccess_index.cgi"; $rmsg = $text{'ftpindex_return'}; } } print "
$title
\n"; print "
\n"; print &text('manual_header', "$file"),"

\n"; print "

\n"; foreach $h ('virt', 'idx', 'file', 'limit', 'anon') { if (defined($in{$h})) { print "\n"; push(@args, "$h=$in{$h}"); } } $args = join('&', @args); print "
\n"; print "
\n"; &footer("$return?$args", $rmsg); proftpd/dir_index.cgi0100755000567100000120000000453207401421103014645 0ustar jcameronwheel#!/usr/local/bin/perl # dir_index.cgi # Display a menu of icons for per-directory options require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } $d = $conf->[$in{'idx'}]; $dn = $d->{'words'}->[0]; $dconf = $d->{'members'}; &header($text{'dir_title'}, ""); print "
",$in{'anon'} ? &text('dir_header4', $dn) : $in{'virt'} ? &text('dir_header1', $dn, $v->{'words'}->[0]) : &text('dir_header2', $dn),"
\n"; print "
\n"; $dir_icon = { "icon" => "images/dir.gif", "name" => $text{'dir_dir'}, "link" => "edit_dserv.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}" }; $ed_icon = { "icon" => "images/edit.gif", "name" => $text{'dir_edit'}, "link" => "manual_form.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}" }; &config_icons("directory", "edit_dir.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}&", $dir_icon, $ed_icon); # Display limit options @lim = &find_directive_struct("Limit", $dconf); if (@lim) { print "
\n"; print "

$text{'dir_header'}

\n"; print "\n"; foreach $l (@lim) { if ($i%3 == 0) { print "\n"; } print "\n"; if ($i++%3 == 2) { print "\n"; } } while($i++%3) { print "\n"; } print "
\n"; &generate_icon("images/limit.gif", &text('virt_limit', $l->{'value'}), "limit_index.cgi?limit=".&indexof($l, @$dconf). "&virt=$in{'virt'}&anon=$in{'anon'}&idx=$in{'idx'}"); print "
\n"; } print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'virt_addlimit'}
\n"; print "\n"; print "\n"; print "
$text{'virt_cmds'}\n"; print "
\n"; print "
\n"; if ($in{'anon'}) { &footer("anon_index.cgi?virt=$in{'virt'}", $text{'anon_return'}); } else { &footer("virt_index.cgi?virt=$in{'virt'}", $text{'virt_return'}); } proftpd/limit_index.cgi0100755000567100000120000000356307401421103015210 0ustar jcameronwheel#!/usr/local/bin/perl # limit_index.cgi # Display a menu of icons for per-command options require './proftpd-lib.pl'; &ReadParse(); if ($in{'file'}) { $conf = &get_ftpaccess_config($in{'file'}); } else { ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $dir = $conf->[$in{'idx'}]; $conf = $dir->{'members'}; } } $l = $conf->[$in{'limit'}]; $ln = $l->{'value'}; &header($text{'limit_title'}, ""); print "
", $in{'file'} ? &text('limit_header6', $ln, $in{'file'}) : $dir ? &text('limit_header4', $ln, $dir->{'words'}->[0]) : $in{'anon'} ? &text('limit_header5', $ln) : $in{'virt'} ? &text('limit_header1', $ln, $v->{'words'}->[0]) : &text('limit_header2', $ln),"
\n"; print "
\n"; $limit_icon = { "icon" => "images/limit.gif", "name" => $text{'limit_limit'}, "link" => "edit_lserv.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&anon=$in{'anon'}&file=$in{'file'}" }; $ed_icon = { "icon" => "images/edit.gif", "name" => $text{'limit_edit'}, "link" => $in{'file'} ? "manual_form.cgi?limit=$in{'limit'}&file=$in{'file'}" : "manual_form.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&anon=$in{'anon'}" }; &config_icons("limit", "edit_limit.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&anon=$in{'anon'}&file=$in{'file'}&", $limit_icon, $ed_icon); print "
\n"; if ($in{'file'}) { &footer("ftpaccess_index.cgi?file=$in{'file'}", $text{'ftpindex_return'}); } elsif ($in{'idx'} eq '') { if ($in{'anon'}) { &footer("anon_index.cgi?virt=$in{'virt'}",$text{'anon_return'}); } else { &footer("virt_index.cgi?virt=$in{'virt'}",$text{'virt_return'}); } } else { &footer("dir_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}", $text{'dir_return'}); } proftpd/edit_dir.cgi0100755000567100000120000000257107401421103014464 0ustar jcameronwheel#!/usr/local/bin/perl # edit_virt.cgi # Display a form for editing some kind of per-directory options require './proftpd-lib.pl'; &ReadParse(); ($vconf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $vconf); $vconf = $anon->{'members'}; } $d = $vconf->[$in{'idx'}]; $conf = $d->{'members'}; @dirs = &editable_directives($in{'type'}, 'directory'); &header($text{"type_$in{'type'}"}, ""); $dn = $d->{'words'}->[0]; print "
",$in{'anon'} ? &text('dir_header4', $dn) : $in{'virt'} ? &text('dir_header1', $dn, $v->{'words'}->[0]) : &text('dir_header2', $dn),"
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
",&text('dir_header3', $text{"type_$in{'type'}"}, $d->{'words'}->[0]),"
\n"; &generate_inputs(\@dirs, $conf); print "

\n"; print "
\n"; print "
\n"; &footer("dir_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}", $text{'dir_return'}); proftpd/save_dir.cgi0100755000567100000120000000137007401421103014471 0ustar jcameronwheel#!/usr/local/bin/perl # save_virt.cgi # Save some kind of per-directory configuration require './proftpd-lib.pl'; &ReadParse(); ($vconf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $vconf); $vconf = $anon->{'members'}; } $d = $vconf->[$in{'idx'}]; $conf = $d->{'members'}; @edit = &editable_directives($in{'type'}, 'directory'); &lock_file($d->{'file'}); $tn = $type_name[$in{'type'}]; $tn =~ tr/A-Z/a-z/; &error_setup(&text('efailed', $text{"type_$in{'type'}"})); &parse_inputs(\@edit, $conf, &get_config()); &unlock_file($d->{'file'}); &webmin_log("dir", $in{'type'}, "$v->{'value'}:$d->{'words'}->[0]", \%in); &redirect("dir_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}"); proftpd/edit_dserv.cgi0100775000567100000120000000261707401421103015034 0ustar jcameronwheel#!/usr/local/bin/perl # edit_dserv.cgi # Edit section details require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } $d = $conf->[$in{'idx'}]; $dn = $d->{'words'}->[0]; $dconf = $d->{'members'}; &header($text{'dserv_title'}, ""); print "
",$in{'virt'} ? &text('dir_header1', $dn, $v->{'words'}->[0]) : &text('dir_header2', $dn),"
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'dserv_title'}
\n"; print "\n"; printf "\n", $d->{'value'}, &file_chooser_button("dir", 1); print "\n"; print "
$text{'dserv_dir'} %s
\n"; print "\n"; print "\n"; print "

\n"; print "

\n"; print "
\n"; &footer("dir_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}", $text{'dir_return'}); proftpd/save_dserv.cgi0100775000567100000120000000221307401421103015035 0ustar jcameronwheel#!/usr/local/bin/perl # save_dserv.cgi # Save directory section options require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } $d = $conf->[$in{'idx'}]; &error_setup($text{'dserv_err'}); if ($in{'delete'}) { # Delete the directory &lock_file($d->{'file'}); $lref = &read_file_lines($d->{'file'}); splice(@$lref, $d->{'line'}, $d->{'eline'} - $d->{'line'} + 1); &flush_file_lines(); &unlock_file($d->{'file'}); &webmin_log("dir", "delete", "$v->{'value'}:$d->{'words'}->[0]"); if ($in{'anon'}) { &redirect("anon_index.cgi?virt=$in{'virt'}"); } else { &redirect("virt_index.cgi?virt=$in{'virt'}"); } } else { # Update the directory $in{'dir'} =~ /^\S+$/ || &error($text{'dserv_edir'}); &lock_file($d->{'file'}); $lref = &read_file_lines($d->{'file'}); $lref->[$d->{'line'}] = ""; &flush_file_lines(); &unlock_file($d->{'file'}); &webmin_log("dir", "save", "$v->{'value'}:$d->{'words'}->[0]"); &redirect("dir_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}"); } proftpd/edit_limit.cgi0100755000567100000120000000350007401421103015015 0ustar jcameronwheel#!/usr/local/bin/perl # edit_limit.cgi # Display a form for editing some kind of limit section options require './proftpd-lib.pl'; &ReadParse(); if ($in{'file'}) { $conf = &get_ftpaccess_config($in{'file'}); } else { ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $dir = $conf->[$in{'idx'}]; $conf = $dir->{'members'}; } } $l = $conf->[$in{'limit'}]; $conf = $l->{'members'}; $ln = $l->{'value'}; @dirs = &editable_directives($in{'type'}, 'limit'); &header($text{"type_$in{'type'}"}, ""); print "
", $in{'file'} ? &text('limit_header6', $ln, $in{'file'}) : $dir ? &text('limit_header4', $ln, $dir->{'words'}->[0]) : $in{'anon'} ? &text('limit_header5', $ln) : $in{'virt'} ? &text('limit_header1', $ln, $v->{'words'}->[0]) : &text('limit_header2', $ln),"
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
",&text('limit_header3', $text{"type_$in{'type'}"}, $l->{'value'}),"
\n"; &generate_inputs(\@dirs, $conf); print "

\n"; print "
\n"; print "
\n"; &footer("limit_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&file=$in{'file'}", $text{'dir_return'}); proftpd/create_dir.cgi0100775000567100000120000000144107401421103014777 0ustar jcameronwheel#!/usr/local/bin/perl # create_dir.cgi # Add a new section to a virtual server require './proftpd-lib.pl'; &ReadParse(); ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } &error_setup($text{'dserv_err'}); # Validate inputs $in{'dir'} =~ /^\S+$/ || &error($text{'dserv_edir'}); # Add the directory $l = $conf->[@$conf - 1]; &lock_file($l->{'file'}); $lref = &read_file_lines($l->{'file'}); @lines = ( "", "" ); splice(@$lref, $l->{'eline'}+1, 0, @lines); &flush_file_lines(); &unlock_file($l->{'file'}); &webmin_log("dir", "create", "$v->{'value'}:$in{'dir'}", \%in); &redirect("dir_index.cgi?virt=$in{'virt'}&anon=$in{'anon'}&idx=".scalar(@$conf)); proftpd/save_limit.cgi0100755000567100000120000000163207401421103015032 0ustar jcameronwheel#!/usr/local/bin/perl # save_limit.cgi # Save some kind of per-command configuration require './proftpd-lib.pl'; &ReadParse(); if ($in{'file'}) { $conf = &get_ftpaccess_config($in{'file'}); } else { ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $conf = $conf->[$in{'idx'}]->{'members'}; } } $l = $conf->[$in{'limit'}]; $conf = $l->{'members'}; @edit = &editable_directives($in{'type'}, 'limit'); &lock_file($l->{'file'}); $tn = $type_name[$in{'type'}]; $tn =~ tr/A-Z/a-z/; &error_setup(&text('efailed', $text{"type_$in{'type'}"})); &parse_inputs(\@edit, $conf, &get_config()); &unlock_file($l->{'file'}); &webmin_log("limit", $in{'type'}, $l->{'value'}, \%in); &redirect("limit_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&anon=$in{'anon'}&file=$in{'file'}"); proftpd/create_limit.cgi0100775000567100000120000000200607401421103015335 0ustar jcameronwheel#!/usr/local/bin/perl # create_limit.cgi # Create a new section require './proftpd-lib.pl'; &ReadParse(); if ($in{'file'}) { $conf = &get_ftpaccess_config($in{'file'}); } else { ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $conf = $conf->[$in{'idx'}]->{'members'}; } } &error_setup($text{'lserv_err'}); # Validate inputs $in{'cmd'} =~ /\S/ || &error($text{'lserv_ecmd'}); # Add the limit $l = $conf->[@$conf - 1]; &lock_file($l->{'file'}); $lref = &read_file_lines($l->{'file'}); @lines = ( "", "" ); splice(@$lref, $l->{'eline'}+1, 0, @lines); &flush_file_lines(); &unlock_file($l->{'file'}); &webmin_log("limit", "create", $in{'cmd'}, \%in); if ($in{'file'}) { &redirect("limit_index.cgi?file=$in{'file'}&limit=".scalar(@$conf)); } else { &redirect("limit_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}&limit=".scalar(@$conf)); } proftpd/save_lserv.cgi0100775000567100000120000000303607401421103015051 0ustar jcameronwheel#!/usr/local/bin/perl # save_dserv.cgi # Save limit section options require './proftpd-lib.pl'; &error_setup($text{'lserv_err'}); &ReadParse(); if ($in{'file'}) { $conf = &get_ftpaccess_config($in{'file'}); } else { ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $conf = $conf->[$in{'idx'}]->{'members'}; } } $l = $conf->[$in{'limit'}]; $ln = $l->{'value'}; if ($in{'delete'}) { # Delete the directory &lock_file($l->{'file'}); $lref = &read_file_lines($l->{'file'}); splice(@$lref, $l->{'line'}, $l->{'eline'} - $l->{'line'} + 1); &flush_file_lines(); &unlock_file($l->{'file'}); if ($in{'file'}) { &redirect("ftpaccess_index.cgi?file=$in{'file'}"); } elsif ($in{'idx'} eq '') { if ($in{'anon'}) { &redirect("anon_index.cgi?virt=$in{'virt'}"); } else { &redirect("virt_index.cgi?virt=$in{'virt'}"); } } else { &redirect("dir_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&anon=$in{'anon'}"); } &webmin_log("limit", "delete", $l->{'value'}); } else { # Update the limit local @c = split(/\0/, $in{'cmd'}); @c || &error($text{'lserv_ecmd'}); &lock_file($l->{'file'}); $lref = &read_file_lines($l->{'file'}); $lref->[$l->{'line'}] = ""; &flush_file_lines(); &unlock_file($l->{'file'}); &redirect("limit_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&anon=$in{'anon'}&file=$in{'file'}"); &webmin_log("limit", "save", $l->{'value'}, \%in); } proftpd/edit_lserv.cgi0100775000567100000120000000435207401421103015042 0ustar jcameronwheel#!/usr/local/bin/perl # edit_dserv.cgi # Edit section details require './proftpd-lib.pl'; &ReadParse(); if ($in{'file'}) { $conf = &get_ftpaccess_config($in{'file'}); } else { ($conf, $v) = &get_virtual_config($in{'virt'}); if ($in{'anon'}) { $anon = &find_directive_struct("Anonymous", $conf); $conf = $anon->{'members'}; } if ($in{'idx'} ne '') { $dir = $conf->[$in{'idx'}]; $conf = $dir->{'members'}; } } $l = $conf->[$in{'limit'}]; $ln = $l->{'value'}; &header($text{'lserv_title'}, ""); print "
", $in{'file'} ? &text('limit_header6', $ln, $in{'file'}) : $dir ? &text('limit_header4', $ln, $dir->{'words'}->[0]) : $in{'anon'} ? &text('limit_header5', $ln) : $in{'virt'} ? &text('limit_header1', $ln, $v->{'words'}->[0]) : &text('limit_header2', $ln),"
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
$text{'lserv_title'}
\n"; map { $cmd{lc($_)}++ } @{$l->{'words'}}; print "\n"; print "\n"; print "\n"; print "
$text{'lserv_cmd'}
\n"; print "\n"; print "\n"; print "

\n"; print "

\n"; print "
\n"; &footer("limit_index.cgi?virt=$in{'virt'}&idx=$in{'idx'}&limit=$in{'limit'}&anon=$in{'anon'}&file=$in{'file'}", $text{'limit_return'}); proftpd/config-msc-linux0100644000567100000120000000016307401421103015312 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid ftpusers=/etc/ftpusers proftpd/mod_readme.pl0100664000567100000120000000065207401421103014643 0ustar jcameronwheel# mod_readme.pl sub mod_readme_directives { local $rv = [ [ 'DisplayReadme', 0, 2, 'virtual anon global', 1.20 ] ]; return &make_directives($rv, $_[0], "mod_readme"); } sub edit_DisplayReadme { return (1, $text{'mod_readme_display'}, &opt_input($_[0]->{'value'}, "DisplayReadme", $text{'mod_readme_none'}, 15)); } sub save_DisplayReadme { return &parse_opt("DisplayReadme", '^\S+$', $text{'mod_readme_edisplay'}); } proftpd/mod_auth.pl0100664000567100000120000000435107401421103014347 0ustar jcameronwheel# mod_auth.pl sub mod_auth_directives { local $rv = [ [ 'DefaultChdir', 0, 2, 'virtual anon global', 1.20 ], [ 'DefaultRoot', 1, 2, 'virtual global', 0.99 ], [ 'LoginPasswordPrompt', 0, 3, 'virtual anon global', 1.20 ], [ 'RootLogin', 0, 6, 'virtual anon global', 1.15 ] ]; return &make_directives($rv, $_[0], "mod_auth"); } sub edit_DefaultChdir { return (1, $text{'mod_auth_chdir'}, &opt_input($_[0]->{'value'}, "DefaultChdir", $text{'default'}, 20)); } sub save_DefaultChdir { return &parse_opt("DefaultChdir", '^\S+$', $text{'mod_auth_echdir'}); } sub edit_DefaultRoot { local $rv = "\n". " ". "\n"; local $i = 0; foreach $r (@{$_[0]}, { }) { local @w = @{$r->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= sprintf "\n", join(" ", split(/,/, $w[1])); $rv .= "\n"; $i++; } $rv .= "
$text{'mod_auth_dir'}$text{'mod_auth_groups'}
%s\n", $w[1] ? "" : "checked", $text{'mod_auth_all'}; $rv .= sprintf "\n", $w[1] ? "checked" : ""; $rv .= sprintf "
\n"; return (2, $text{'mod_auth_chroot'}, $rv); } sub save_DefaultRoot { for($i=0; defined($in{"DefaultRoot_d_$i"}); $i++) { next if (!$in{"DefaultRoot_d_$i"}); $in{"DefaultRoot_d_$i"} =~ /^\S+$/ || &error($text{'mod_auth_edir'}); local $v = $in{"DefaultRoot_d_$i"}; if (!$in{"DefaultRoot_gd_$i"}) { local @g = split(/\s+/, $in{"DefaultRoot_g_$i"}); @g || &error($text{'mod_auth_egroups'}); $v .= " ".join(",", @g); } push(@rv, $v); } return ( \@rv ); } sub edit_LoginPasswordPrompt { return (1, $text{'mod_auth_login'}, &choice_input($_[0]->{'value'}, "LoginPasswordPrompt", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_LoginPasswordPrompt { return &parse_choice("LoginPasswordPrompt", ""); } sub edit_RootLogin { return (1, $text{'mod_auth_root'}, &choice_input($_[0]->{'value'}, "RootLogin", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_RootLogin { return &parse_choice("RootLogin", ""); } proftpd/mod_site.pl0100664000567100000120000000067207401421103014354 0ustar jcameronwheel# mod_site.pl sub mod_site_directives { local $rv = [ [ 'AllowChmod', 0, 3, 'virtual directory anon limit ftpaccess global', 1.20 ] ]; return &make_directives($rv, $_[0], "mod_site"); } sub edit_AllowChmod { return (1, $text{'mod_site_chmod'}, &choice_input($_[0]->{'value'}, "AllowChmod", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AllowChmod { return &parse_choice("AllowChmod", ""); } proftpd/mod_log.pl0100664000567100000120000000621507401421103014170 0ustar jcameronwheel# mod_log.pl sub mod_log_directives { local $rv = [ [ 'SystemLog', 0, 1, 'root', 1.16 ], [ 'ExtendedLog', 1, 1, 'virtual anon global', 1.16 ], [ 'LogFormat', 1, 1, 'root', 1.16 ] ]; return &make_directives($rv, $_[0], "mod_log"); } sub edit_SystemLog { return (2, $text{'mod_log_syslog'}, &opt_input($_[0]->{'value'}, "SystemLog", $text{'mod_log_sysdef'}, 50, &file_chooser_button("TransferLog"))); } sub save_SystemLog { return &parse_opt("SystemLog", '^\/\S+$', $text{'mod_log_esyslog'}); } sub edit_ExtendedLog { local $rv = "\n". " ". " ". "\n"; local $i = 0; foreach $l (@{$_[0]}, { }) { local @w = @{$l->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= sprintf "\n", $w[1] && $w[2] ? join(" ", split(/,/, $w[1])) : ""; $rv .= sprintf "\n", $w[2] ? $w[2] : $w[1]; $rv .= "\n"; $i++; } $rv .= "
$text{'mod_log_file'}$text{'mod_log_cmd'}$text{'mod_log_nick'}
%s\n", $w[1] && $w[2] ? "" : "checked", $text{'mod_log_all'}; $rv .= sprintf "\n", $w[1] && $w[2] ? "checked" : ""; $rv .= sprintf " %s\n", $w[2] || $w[1] ? "" : "checked", $text{'default'}; $rv .= sprintf "\n", $w[2] || $w[1] ? "checked" : ""; $rv .= sprintf "
\n"; return (2, $text{'mod_log_extended'}, $rv); } sub save_ExtendedLog { local @rv; for($i=0; defined($in{"ExtendedLog_t_$i"}); $i++) { next if (!$in{"ExtendedLog_t_$i"}); local @w = ( $in{"ExtendedLog_t_$i"} ); if (!$in{"ExtendedLog_cd_$i"}) { $in{"ExtendedLog_fd_$i"} && &error($text{'mod_log_ecmdnick'}); $in{"ExtendedLog_c_$i"} =~ /\S/ || &error($text{'mod_log_ecmd'}); push(@w, join(",", map { uc($_) } split(/\s+/, $in{"ExtendedLog_c_$i"}))); } if (!$in{"ExtendedLog_fd_$i"}) { $in{"ExtendedLog_f_$i"} =~ /^\S+$/ || &error($text{'mod_log_enick'}); push(@w, $in{"ExtendedLog_f_$i"}); } push(@rv, join(" ", @w)); } return ( \@rv ); } sub edit_LogFormat { local $rv = "\n". " ". "\n"; local $i = 0; foreach $f (@{$_[0]}, { }) { local @w = @{$f->{'words'}}; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $i++; } $rv .= "
$text{'mod_log_nickname'}$text{'mod_log_fmt'}
\n"; return (2, $text{'mod_log_format'}, $rv); } sub save_LogFormat { local @rv; for($i=0; defined($in{"LogFormat_n_$i"}); $i++) { next if (!$in{"LogFormat_n_$i"}); $in{"LogFormat_n_$i"} =~ /^\S+$/ || &error($text{'mod_log_enickname'}); $in{"LogFormat_f_$i"} =~ /\S/ || &error($text{'mod_log_efmt'}); $in{"LogFormat_f_$i"} =~ s/"/\\"/g; push(@rv, sprintf "%s \"%s\"", $in{"LogFormat_n_$i"}, $in{"LogFormat_f_$i"}); } return ( \@rv ); } proftpd/mod_pam.pl0100664000567100000120000000124407401421103014161 0ustar jcameronwheel# mod_pam.pl sub mod_pam_directives { local $rv = [ [ 'AuthPAM', 0, 6, 'virtual global', 1.20 ], [ 'AuthPAMConfig', 0, 6, 'virtual global', 1.20 ] ]; return &make_directives($rv, $_[0], "mod_pam"); } sub edit_AuthPAM { return (1, $text{'mod_pam_pam'}, &choice_input($_[0]->{'value'}, "AuthPAM", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AuthPAM { return &parse_choice("AuthPAM", ""); } sub edit_AuthPAMConfig { return (1, $text{'mod_pam_config'}, &opt_input($_[0]->{'value'}, "AuthPAMConfig", $text{'default'}, 15)); } sub save_AuthPAMConfig { return &parse_opt("AuthPAMConfig", '^\S+$', $text{'mod_pam_econfig'}); } proftpd/config0100644000567100000120000000021107401421103013367 0ustar jcameronwheelproftpd_path=/usr/local/sbin/proftpd proftpd_conf=/usr/local/etc/proftpd.conf pid_file=/usr/local/var/proftpd.pid ftpusers=/etc/ftpusers proftpd/mod_unixpw.pl0100664000567100000120000000305207401421103014735 0ustar jcameronwheel# mod_unixpw.pl sub mod_unixpw_directives { local $rv = [ [ 'AuthUserFile', 0, 6, 'virtual global', 1.11 ], [ 'AuthGroupFile', 0, 6, 'virtual global', 1.11 ], [ 'AuthPAMAuthoritative', 0, 6, 'virtual global', 1.20 ], [ 'PersistentPasswd', 0, 6, 'root', 1.15 ] ]; return &make_directives($rv, $_[0], "mod_unixpw"); } sub edit_AuthUserFile { return (2, $text{'mod_unixpw_ufile'}, &opt_input($_[0]->{'value'}, "AuthUserFile", $text{'mod_unixpw_none'}, 50, &file_chooser_button("AuthUserFile"))); } sub save_AuthUserFile { $in{'AuthUserFile_def'} || -r $in{'AuthUserFile'} || &error($text{'mod_unixpw_eufile'}); return &parse_opt("AuthUserFile"); } sub edit_AuthGroupFile { return (2, $text{'mod_unixpw_gfile'}, &opt_input($_[0]->{'value'}, "AuthGroupFile", $text{'mod_unixpw_none'}, 50, &file_chooser_button("AuthGroupFile"))); } sub save_AuthGroupFile { $in{'AuthGroupFile_def'} || -r $in{'AuthGroupFile'} || &error($text{'mod_unixpw_egfile'}); return &parse_opt("AuthGroupFile"); } sub edit_AuthPAMAuthoritative { return (1, $text{'mod_unixpw_pam'}, &choice_input($_[0]->{'value'}, "AuthPAMAuthoritative", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_AuthPAMAuthoritative { return &parse_choice("AuthPAMAuthoritative", ""); } sub edit_PersistentPasswd { return (1, $text{'mod_unixpw_persist'}, &choice_input($_[0]->{'value'}, "PersistentPasswd", "", "$text{'yes'},on", "$text{'no'},off", "$text{'default'},")); } sub save_PersistentPasswd { return &parse_choice("PersistentPasswd", ""); } proftpd/config-open-linux0100644000567100000120000000016307401421103015471 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid ftpusers=/etc/ftpusers proftpd/config-redhat-linux0100644000567100000120000000016307401421103015777 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid ftpusers=/etc/ftpusers proftpd/config-mandrake-linux0100644000567100000120000000023407401421103016311 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid start_cmd=/etc/rc.d/init.d/proftpd start ftpusers=/etc/ftpusers proftpd/config-slackware-linux0100644000567100000120000000016307401421103016504 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid ftpusers=/etc/ftpusers proftpd/config-debian-linux0100644000567100000120000000022707401421103015753 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid start_cmd=/etc/init.d/proftpd start ftpusers=/etc/ftpusers proftpd/config-suse-linux0100644000567100000120000000022707401421103015510 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid start_cmd=/etc/init.d/proftpd start ftpusers=/etc/ftpusers proftpd/config-turbo-linux0100644000567100000120000000023407401421103015662 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid start_cmd=/etc/rc.d/init.d/proftpd start ftpusers=/etc/ftpusers proftpd/config-cobalt-linux0100644000567100000120000000016307401421103015774 0ustar jcameronwheelproftpd_path=/usr/sbin/proftpd proftpd_conf=/etc/proftpd.conf pid_file=/var/run/proftpd.pid ftpusers=/etc/ftpusers proftpd/config.info.pl0100664000567100000120000000037607401421103014751 0ustar jcameronwheelproftpd_conf=Ścieżka do pliku konfiguracyjnego ProFTPD,0 proftpd_path=Ścieżka do programu ProFTPD,0 pid_file=Ścieżka do pliku z numerem PID ProFTPD,0 ftpusers=Ścieżka do pliku ftpusers,0 start_cmd=Polecenie uruchamiające ProFTPD,3,Automatycznie proftpd/ftpaccess.cgi0100755000567100000120000000250607401421103014652 0ustar jcameronwheel#!/usr/local/bin/perl # ftpaccess.cgi # Display a list of per-directory config files require './proftpd-lib.pl'; &header($text{'ftpaccess_title'}, ""); print "
\n"; print "$text{'ftpaccess_desc'}

\n"; if (@ftpaccess_files) { print "\n"; print "\n"; print "
$text{'ftpaccess_title'}
\n"; for($i=0; $i<@ftpaccess_files; $i++) { if ($i%2 == 0) { print "\n"; } print "\n"; if ($i%2 == 1) { print "\n"; } } print "
",$ftpaccess_files[$i], "

\n"; } print "

\n"; print "\n"; print "\n", &file_chooser_button("file", 0, 0); print "
\n"; print "
\n"; print "\n"; print " ", "$text{'ftpaccess_auto'}  \n"; print "\n"; print "$text{'ftpaccess_from'}\n"; print "\n", &file_chooser_button("dir", 1, 1); print "
\n"; print "
\n"; &footer("", $text{'index_return'}); proftpd/ftpaccess_index.cgi0100755000567100000120000000340507401421103016040 0ustar jcameronwheel#!/usr/local/bin/perl # ftpaccess_index.cgi # Display a menu of icons for a per-directory options file require './proftpd-lib.pl'; &ReadParse(); $conf = &get_ftpaccess_config($in{'file'}); &header($text{'ftpindex_title'}, "", undef, undef, undef, undef, "$text{'ftpindex_delete'}"); print "
$in{'file'}
\n"; print "
\n"; print "

$text{'ftpindex_opts'}

\n"; $ed_icon = { "icon" => "images/edit.gif", "name" => $text{'ftpindex_edit'}, "link" => "manual_form.cgi?file=$in{'file'}" }; &config_icons("ftpaccess", "edit_ftpaccess.cgi?file=$in{'file'}&", $ed_icon); @limit = ( &find_directive_struct("Limit", $conf) ); if (@limit) { # Limit sub-directives print "
\n"; print "

$text{'ftpindex_limit'}

\n"; print "\n"; foreach $l (@limit) { if ($i%3 == 0) { print "\n"; } print "\n"; if ($i++%3 == 2) { print "\n"; } } while($i++%3) { print "\n"; } print "
\n"; &generate_icon("images/limit.gif", $l->{'value'}, "limit_index.cgi?limit=".&indexof($l, @$conf). "&file=$in{'file'}"); print "

\n"; } print "

\n"; print "\n"; print "\n"; print "\n"; print "
$text{'ftpindex_addlimit'}
\n"; print "\n"; print "\n"; print "
$text{'ftpindex_cmds'}\n"; print "
\n"; print "
\n"; &footer("ftpaccess.cgi", $text{'ftpaccess_return'}); proftpd/edit_ftpusers.cgi0100775000567100000120000000107007401421103015554 0ustar jcameronwheel#!/usr/local/bin/perl # edit_ftpusers.cgi # Lists users to be denied access require './proftpd-lib.pl'; &header($text{'ftpusers_title'}, ""); print "
\n"; print &text('ftpusers_desc', "$config{'ftpusers'}"),"

\n"; print "

\n"; print "
\n"; print "
\n"; print "
\n"; &footer("", $text{'index_return'}); proftpd/save_ftpusers.cgi0100775000567100000120000000057107401421103015572 0ustar jcameronwheel#!/usr/local/bin/perl # save_ftpusers.cgi # Saves users to be denied access require './proftpd-lib.pl'; &ReadParse(); @users = split(/\s+/, $in{'users'}); &lock_file($config{'ftpusers'}); open(USERS, ">$config{'ftpusers'}"); foreach $u (@users) { print USERS $u,"\n"; } close(USERS); &unlock_file($config{'ftpusers'}); &webmin_log("ftpusers", undef, undef); &redirect(""); proftpd/find_ftpaccess.cgi0100755000567100000120000000200607401421103015645 0ustar jcameronwheel#!/usr/local/bin/perl # find_ftpaccess.cgi # Finds all per-directory options files under the all the document roots require './proftpd-lib.pl'; &ReadParse(); @rv = grep { -r $_ } @ftpaccess_files; &error_setup($text{'find_err'}); if ($in{'from'}) { # Look under the given directory @dirs = ( $in{'dir'} ); } else { # Look in Anonymous sections $conf = &get_config(); $anon = &find_directive("Anonymous", $conf); push(@dirs, $anon) if ($anon); foreach $v (&find_directive_struct("VirtualHost", $conf)) { $anon = &find_directive("Anonymous", $v->{'members'}); push(@dirs, $anon) if ($anon); } &error($text{'find_eanon'}) if (!@dirs); } foreach $d (@dirs) { if ($d =~ /^~(\S+)$/) { local @u = getpwnam($1); $d = $u[7]; next if (!$u[7]); } open(FIND, "find '$d' -name .ftpaccess -print |"); while() { s/\r|\n//g; push(@rv, $_); } close(FIND); } # save results $site{'ftpaccess'} = join(' ', &unique(@rv)); &write_file("$module_config_directory/site", \%site); &redirect("ftpaccess.cgi"); proftpd/edit_ftpaccess.cgi0100755000567100000120000000200107401421103015645 0ustar jcameronwheel#!/usr/local/bin/perl # edit_ftpaccess.cgi # Display a form for editing some kind of per-directory options file require './proftpd-lib.pl'; &ReadParse(); $conf = &get_ftpaccess_config($in{'file'}); @dirs = &editable_directives($in{'type'}, 'ftpaccess'); &header($text{"type_$in{'type'}"}, ""); print "
",&text('ftpindex_header', "$in{'file'}"), "
\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
",&text('ftpindex_header2', $text{"type_$in{'type'}"}, "$in{'file'}"),"
\n"; &generate_inputs(\@dirs, $conf); print "

\n"; print "
\n"; print "
\n"; &footer("ftpaccess_index.cgi?file=$in{'file'}", $text{'ftpindex_return'}); proftpd/save_ftpaccess.cgi0100755000567100000120000000075407401421103015673 0ustar jcameronwheel#!/usr/local/bin/perl # save_ftpaccess.cgi # Save some kind of per-directory options file require './proftpd-lib.pl'; &ReadParse(); $conf = &get_ftpaccess_config($in{'file'}); @edit = &editable_directives($in{'type'}, 'ftpaccess'); &lock_file($in{'file'}); &error_setup(&text('efailed', $text{"type_$in{'type'}"})); &parse_inputs(\@edit, $conf, $conf); &unlock_file($in{'file'}); &webmin_log("ftpaccess", $in{'type'}, $in{'file'}, \%in); &redirect("ftpaccess_index.cgi?file=$in{'file'}"); proftpd/delete_ftpaccess.cgi0100755000567100000120000000063607401421103016176 0ustar jcameronwheel#!/usr/local/bin/perl # delete_ftpaccess.cgi # Delete some .ftpaccess or similar file require './proftpd-lib.pl'; &ReadParse(); &lock_file($in{'file'}); unlink($in{'file'}); &unlock_file($in{'file'}); $site{'ftpaccess'} = join(' ', (grep { $_ ne $in{'file'} } @ftpaccess_files)); &write_file("$module_config_directory/site", \%site); &webmin_log("ftpaccess", "delete", $in{'file'}); &redirect("ftpaccess.cgi"); proftpd/create_ftpaccess.cgi0100755000567100000120000000137507401421103016200 0ustar jcameronwheel#!/usr/local/bin/perl # create_ftpaccess.cgi # Creates a new .ftpaccess file for some directory require './proftpd-lib.pl'; &ReadParse(); $conf = &get_config(); if (-d $in{'file'}) { # user entered a directory.. create a file in that directory $file = "$in{'file'}/.ftpaccess"; } else { $file = $in{'file'}; } # create the file (if needed), and add to the known list &lock_file($file); if (!(-r $file)) { open(FTPACCESS, ">$file") || &error($!); close(FTPACCESS); chmod(0755, $file); } $site{'ftpaccess'} = join(' ', &unique(@ftpaccess_files, $file)); &write_file("$module_config_directory/site", \%site); &unlock_file($file); &webmin_log("ftpaccess", "create", $file); # redirect to editing index &redirect("ftpaccess_index.cgi?file=".&urlize($file)); proftpd/log_parser.pl0100644000567100000120000000513007401421103014676 0ustar jcameronwheel# log_parser.pl # Functions for parsing this module's logs require './proftpd-lib.pl'; # parse_webmin_log(user, script, action, type, object, ¶ms, long) # Converts logged information from this module into human-readable form sub parse_webmin_log { local ($user, $script, $action, $type, $object, $p, $long) = @_; local $typestr = "".$text{"type_$type"}.""; if ($action eq 'global') { return &text('log_global', $typestr); } elsif ($action eq 'ftpusers') { return $text{'log_ftpusers'}; } elsif ($action eq 'virt') { $object = $text{'index_defserv'} if ($object eq '-'); if ($type eq 'create') { return &text('log_virtc', "$object"); } elsif ($type eq 'save') { return &text('log_virts', "$object"); } elsif ($type eq 'delete') { return &text('log_virtd', "$object"); } elsif ($type eq 'manual') { return &text('log_virtm', "$object"); } else { return &text('log_virt', $typestr, "$object"); } } elsif ($action eq 'dir') { local ($virt, $dir) = split(/:/, $object); $virt = $text{'index_defserv'} if (!$virt); if ($type eq 'create') { return &text($long ? 'log_dirc_l' : 'log_dirc', "$dir", "$virt"); } elsif ($type eq 'save') { return &text($long ? 'log_dirs_l' : 'log_dirs', "$dir", "$virt"); } elsif ($type eq 'delete') { return &text($long ? 'log_dird_l' : 'log_dird', "$dir", "$virt"); } elsif ($type eq 'manual') { return &text($long ? 'log_dirm_l' : 'log_dirm', "$dir", "$virt"); } else { return &text($long ? 'log_dir_l' : 'log_dir', $typestr, "$dir", "$virt"); } } elsif ($action eq 'limit') { if ($type eq 'create') { return &text('log_limitc', "$object"); } elsif ($type eq 'save') { return &text('log_limits', "$object"); } elsif ($type eq 'delete') { return &text('log_limitd', "$object"); } elsif ($type eq 'manual') { return &text('log_limitm', "$object"); } else { return &text('log_limit', $typestr, "$object"); } } elsif ($action eq 'ftpaccess') { if ($type eq 'create') { return &text('log_ftpaccessc', "$object"); } elsif ($type eq 'save') { return &text('log_ftpaccesss', "$object"); } elsif ($type eq 'delete') { return &text('log_ftpaccessd', "$object"); } elsif ($type eq 'manual') { return &text('log_ftpaccessm', "$object"); } else { return &text('log_ftpaccess', $typestr, "$object"); } } else { return $ttext{"log_$action"}; } } proftpd/config.info.es0100664000567100000120000000035707401421103014744 0ustar jcameronwheelproftpd_conf=Ruta al archivo de configuración de ProFTPD,0 proftpd_path=Ruta al archivo ejecutable ProFTPD,0 pid_file=Ruta al archivo PID de ProFTPD,0 ftpusers=Ruta al archivo ftpusers,0 start_cmd=Comando para iniciar ProFTPD,3,Automático