From dad5bd7c146a842e11da19c5715db117d62f5677 Mon Sep 17 00:00:00 2001 From: Thorsten Kukuk Date: Fri, 10 Oct 2008 06:53:45 +0000 Subject: Relevant BUGIDs: Purpose of commit: new feature Commit summary: --------------- 2008-10-10 Thorsten Kukuk * configure.in: add modules/pam_pwhistory/Makefile. * doc/sag/Linux-PAM_SAG.xml: Include pam_pwhistory.xml. * doc/sag/pam_pwhistory.xml: New. * libpam/pam_static_modules.h: Add pam_pwhistory data. * modules/Makefile.am: Add pam_pwhistory directory. * modules/pam_pwhistory/Makefile.am: New. * modules/pam_pwhistory/README.xml: New. * modules/pam_pwhistory/opasswd.c: New. * modules/pam_pwhistory/opasswd.h: New. * modules/pam_pwhistory/pam_pwhistory.8.xml: New. * modules/pam_pwhistory/pam_pwhistory.c: New. * modules/pam_pwhistory/tst-pam_pwhistory: New. * xtests/Makefile.am: New. * xtests/run-xtests.sh: New. * xtests/tst-pam_pwhistory1.c: New. * xtests/tst-pam_pwhistory1.pamd: New. * xtests/tst-pam_pwhistory1.sh: New. * po/POTFILES.in: Add modules/pam_pwhistory/. * po/de.po: Update translations. --- libpam/pam_static_modules.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libpam/pam_static_modules.h') diff --git a/libpam/pam_static_modules.h b/libpam/pam_static_modules.h index a66b486d..d45f2977 100644 --- a/libpam/pam_static_modules.h +++ b/libpam/pam_static_modules.h @@ -61,6 +61,7 @@ extern struct pam_module _pam_namespace_modstruct; #endif extern struct pam_module _pam_nologin_modstruct; extern struct pam_module _pam_permit_modstruct; +extern struct pam_module _pam_pwhistory_modstruct; extern struct pam_module _pam_rhosts_modstruct; extern struct pam_module _pam_rhosts_auth_modstruct; extern struct pam_module _pam_rootok_modstruct; @@ -119,6 +120,7 @@ static struct pam_module *static_modules[] = { #endif &_pam_nologin_modstruct, &_pam_permit_modstruct, + &_pam_pwhistory_modstruct, &_pam_rhosts_modstruct, &_pam_rhosts_auth_modstruct, &_pam_rootok_modstruct, -- cgit v1.2.3 From 114ed318bea9b5859ab89144261946716776e2ed Mon Sep 17 00:00:00 2001 From: Tomas Mraz Date: Fri, 17 Oct 2008 11:29:55 +0000 Subject: Relevant BUGIDs: Purpose of commit: new feature Commit summary: --------------- 2008-10-17 Tomas Mraz * configure.in: Add modules/pam_tally2/Makefile. * doc/sag/Linux-PAM_SAG.xml: Include pam_tally2.xml. * doc/sag/pam_tally2.xml: New. * libpam/pam_static_modules.h: Add pam_tally2 static struct. * modules/Makefile.am: Add pam_tally2 directory. * modules/pam_tally2/Makefile.am: New. * modules/pam_tally2/README.xml: New. * modules/pam_tally2/tallylog.h: New. * modules/pam_tally2/pam_tally2.8.xml: New. * modules/pam_tally2/pam_tally2.c: New. * modules/pam_tally2/pam_tally2_app.c: New. * modules/pam_tally2/tst-pam_tally2: New. * po/POTFILES.in: Add pam_tally2 sources. --- ChangeLog | 16 + NEWS | 2 + configure.in | 1 + doc/sag/Linux-PAM_SAG.xml | 2 + doc/sag/pam_tally2.xml | 46 ++ libpam/pam_static_modules.h | 2 + modules/Makefile.am | 2 +- modules/pam_tally2/.cvsignore | 9 + modules/pam_tally2/Makefile.am | 40 ++ modules/pam_tally2/README.xml | 46 ++ modules/pam_tally2/pam_tally2.8.xml | 439 ++++++++++++++++ modules/pam_tally2/pam_tally2.c | 985 ++++++++++++++++++++++++++++++++++++ modules/pam_tally2/pam_tally2_app.c | 7 + modules/pam_tally2/tallylog.h | 52 ++ modules/pam_tally2/tst-pam_tally2 | 2 + po/POTFILES.in | 2 + 16 files changed, 1652 insertions(+), 1 deletion(-) create mode 100644 doc/sag/pam_tally2.xml create mode 100644 modules/pam_tally2/.cvsignore create mode 100644 modules/pam_tally2/Makefile.am create mode 100644 modules/pam_tally2/README.xml create mode 100644 modules/pam_tally2/pam_tally2.8.xml create mode 100644 modules/pam_tally2/pam_tally2.c create mode 100644 modules/pam_tally2/pam_tally2_app.c create mode 100644 modules/pam_tally2/tallylog.h create mode 100755 modules/pam_tally2/tst-pam_tally2 (limited to 'libpam/pam_static_modules.h') diff --git a/ChangeLog b/ChangeLog index bb810c41..dff2085a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-10-17 Tomas Mraz + + * configure.in: Add modules/pam_tally2/Makefile. + * doc/sag/Linux-PAM_SAG.xml: Include pam_tally2.xml. + * doc/sag/pam_tally2.xml: New. + * libpam/pam_static_modules.h: Add pam_tally2 static struct. + * modules/Makefile.am: Add pam_tally2 directory. + * modules/pam_tally2/Makefile.am: New. + * modules/pam_tally2/README.xml: New. + * modules/pam_tally2/tallylog.h: New. + * modules/pam_tally2/pam_tally2.8.xml: New. + * modules/pam_tally2/pam_tally2.c: New. + * modules/pam_tally2/pam_tally2_app.c: New. + * modules/pam_tally2/tst-pam_tally2: New. + * po/POTFILES.in: Add pam_tally2 sources. + 2008-10-17 Xavier Queralt Mateu * po/ca.po: Updated translations. diff --git a/NEWS b/NEWS index 144757a0..c406472f 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,8 @@ Release 1.0.90 * New options for pam_lastlog to show last failed login attempt and to disable lastlog update * New pam_pwhistory module to store last used passwords +* New pam_tally2 module similar to pam_tally with wordsize independent + tally data format Release 1.0.2 diff --git a/configure.in b/configure.in index 63ba9ddd..087d88cf 100644 --- a/configure.in +++ b/configure.in @@ -548,6 +548,7 @@ AC_CONFIG_FILES([Makefile libpam/Makefile libpamc/Makefile libpamc/test/Makefile modules/pam_sepermit/Makefile \ modules/pam_shells/Makefile modules/pam_stress/Makefile \ modules/pam_succeed_if/Makefile modules/pam_tally/Makefile \ + modules/pam_tally2/Makefile \ modules/pam_time/Makefile modules/pam_tty_audit/Makefile \ modules/pam_umask/Makefile \ modules/pam_unix/Makefile modules/pam_userdb/Makefile \ diff --git a/doc/sag/Linux-PAM_SAG.xml b/doc/sag/Linux-PAM_SAG.xml index b5a1781a..a1989c9a 100644 --- a/doc/sag/Linux-PAM_SAG.xml +++ b/doc/sag/Linux-PAM_SAG.xml @@ -458,6 +458,8 @@ session required pam_warn.so href="pam_succeed_if.xml"/> + + +
+ pam_tally2 - login counter (tallying) module + + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/libpam/pam_static_modules.h b/libpam/pam_static_modules.h index d45f2977..2d80cecb 100644 --- a/libpam/pam_static_modules.h +++ b/libpam/pam_static_modules.h @@ -74,6 +74,7 @@ extern struct pam_module _pam_shells_modstruct; extern struct pam_module _pam_stress_modstruct; extern struct pam_module _pam_succeed_if_modstruct; extern struct pam_module _pam_tally_modstruct; +extern struct pam_module _pam_tally2_modstruct; extern struct pam_module _pam_time_modstruct; #ifdef HAVE_AUDIT_TTY_STATUS extern struct pam_module _pam_tty_audit_modstruct; @@ -133,6 +134,7 @@ static struct pam_module *static_modules[] = { &_pam_stress_modstruct, &_pam_succeed_if_modstruct, &_pam_tally_modstruct, + &_pam_tally2_modstruct, &_pam_time_modstruct, #ifdef HAVE_AUDIT_TTY_STATUS &_pam_tty_audit_modstruct, diff --git a/modules/Makefile.am b/modules/Makefile.am index f21d52e8..37d5a739 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -9,7 +9,7 @@ SUBDIRS = pam_access pam_cracklib pam_debug pam_deny pam_echo \ pam_mkhomedir pam_motd pam_namespace pam_nologin \ pam_permit pam_pwhistory pam_rhosts pam_rootok pam_securetty \ pam_selinux pam_sepermit pam_shells pam_stress \ - pam_succeed_if pam_tally pam_time pam_tty_audit pam_umask \ + pam_succeed_if pam_tally pam_tally2 pam_time pam_tty_audit pam_umask \ pam_unix pam_userdb pam_warn pam_wheel pam_xauth CLEANFILES = *~ diff --git a/modules/pam_tally2/.cvsignore b/modules/pam_tally2/.cvsignore new file mode 100644 index 00000000..c20ebb92 --- /dev/null +++ b/modules/pam_tally2/.cvsignore @@ -0,0 +1,9 @@ +*.la +*.lo +.deps +.libs +Makefile +Makefile.in +pam_tally2 +README +pam_tally2.8 diff --git a/modules/pam_tally2/Makefile.am b/modules/pam_tally2/Makefile.am new file mode 100644 index 00000000..6f843e1f --- /dev/null +++ b/modules/pam_tally2/Makefile.am @@ -0,0 +1,40 @@ +# +# Copyright (c) 2005, 2006, 2007 Thorsten Kukuk +# Copyright (c) 2008 Red Hat, Inc. +# + +CLEANFILES = *~ + +EXTRA_DIST = README $(MANS) $(XMLS) tst-pam_tally2 + +man_MANS = pam_tally2.8 +XMLS = README.xml pam_tally2.8.xml + +TESTS = tst-pam_tally2 + +securelibdir = $(SECUREDIR) +secureconfdir = $(SCONFIGDIR) + +noinst_HEADERS = tallylog.h + +AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include + +pam_tally2_la_LDFLAGS = -no-undefined -avoid-version -module +pam_tally2_la_LIBADD = -L$(top_builddir)/libpam -lpam $(LIBAUDIT) +if HAVE_VERSIONING + pam_tally2_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map +endif + +pam_tally2_LDADD = $(LIBAUDIT) + +securelib_LTLIBRARIES = pam_tally2.la +sbin_PROGRAMS = pam_tally2 + +pam_tally2_la_SOURCES = pam_tally2.c +pam_tally2_SOURCES = pam_tally2_app.c + +if ENABLE_REGENERATE_MAN +noinst_DATA = README +README: pam_tally2.8.xml +-include $(top_srcdir)/Make.xml.rules +endif diff --git a/modules/pam_tally2/README.xml b/modules/pam_tally2/README.xml new file mode 100644 index 00000000..aa470570 --- /dev/null +++ b/modules/pam_tally2/README.xml @@ -0,0 +1,46 @@ + + +--> +]> + +
+ + + + + <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" + href="pam_tally2.8.xml" xpointer='xpointer(//refnamediv[@id = "pam_tally2-name"]/*)'/> + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
diff --git a/modules/pam_tally2/pam_tally2.8.xml b/modules/pam_tally2/pam_tally2.8.xml new file mode 100644 index 00000000..dc284a1d --- /dev/null +++ b/modules/pam_tally2/pam_tally2.8.xml @@ -0,0 +1,439 @@ + + + + + + + pam_tally2 + 8 + Linux-PAM Manual + + + + pam_tally2 + The login counter (tallying) module + + + + + pam_tally2.so + + file=/path/to/counter + + + onerr=[fail|succeed] + + + magic_root + + + even_deny_root + + + deny=n + + + lock_time=n + + + unlock_time=n + + + root_unlock_time=n + + + audit + + + silent + + + no_log_info + + + + pam_tally2 + + --file /path/to/counter + + + --user username + + + --reset[=n] + + + --quiet + + + + + + + DESCRIPTION + + + This module maintains a count of attempted accesses, can + reset count on success, can deny access if too many attempts fail. + + + pam_tally2 comes in two parts: + pam_tally2.so and + pam_tally2. The former is the PAM module and + the latter, a stand-alone program. pam_tally2 + is an (optional) application which can be used to interrogate and + manipulate the counter file. It can display users' counts, set + individual counts, or clear all counts. Setting artificially high + counts may be useful for blocking users without changing their + passwords. For example, one might find it useful to clear all counts + every midnight from a cron job. + + + Normally, failed attempts to access root will + not cause the root account to become + blocked, to prevent denial-of-service: if your users aren't given + shell accounts and root may only login via su or + at the machine console (not telnet/rsh, etc), this is safe. + + + + + + OPTIONS + + + + GLOBAL OPTIONS + + + + This can be used for auth and + account module types. + + + + + + + + + If something weird happens (like unable to open the file), + return with PAM_SUCESS if + + is given, else with the corresponding PAM error code. + + + + + + + + + + File where to keep counts. Default is + /var/log/tallylog. + + + + + + + + + + Will log the user name into the system log if the user is not found. + + + + + + + + + + Don't print informative messages. + + + + + + + + + + Don't log informative messages via syslog3. + + + + + + + + + + AUTH OPTIONS + + + + Authentication phase first increments attempted login counter and + checks if user should be denied access. If the user is authenticated + and the login process continues on call to + pam_setcred3 + it resets the attempts counter. + + + + + + + + + Deny access if tally for this user exceeds + n. + + + + + + + + + + Always deny for n seconds + after failed attempt. + + + + + + + + + + Allow access after n seconds + after failed attempt. If this option is used the user will + be locked out for the specified amount of time after he + exceeded his maximum allowed attempts. Otherwise the + account is locked until the lock is removed by a manual + intervention of the system administrator. + + + + + + + + + + If the module is invoked by a user with uid=0 the + counter is not incremented. The sys-admin should use this + for user launched services, like su, + otherwise this argument should be omitted. + + + + + + + + + + Do not use the .fail_locktime field in + /var/log/faillog for this user. + + + + + + + + + + Don't reset count on successful entry, only decrement. + + + + + + + + + + Root account can become unavailable. + + + + + + + + + + This option implies option. + Allow access after n seconds + to root acccount after failed attempt. If this option is used + the root user will be locked out for the specified amount of + time after he exceeded his maximum allowed attempts. + + + + + + + + + + + ACCOUNT OPTIONS + + + + Account phase resets attempts counter if the user is + not magic root. + This phase can be used optionaly for services which don't call + + pam_setcred3 + correctly or if the reset should be done regardless + of the failure of the account phase of other modules. + + + + + + + + + If the module is invoked by a user with uid=0 the + counter is not changed. The sys-admin should use this + for user launched services, like su, + otherwise this argument should be omitted. + + + + + + + + + + + MODULE TYPES PROVIDED + + The and + module types are provided. + + + + + RETURN VALUES + + + PAM_AUTH_ERR + + + A invalid option was given, the module was not able + to retrive the user name, no valid counter file + was found, or too many failed logins. + + + + + PAM_SUCCESS + + + Everything was successfull. + + + + + PAM_USER_UNKNOWN + + + User not known. + + + + + + + + NOTES + + pam_tally2 is not compatible with the old pam_tally faillog file format. + This is caused by requirement of compatibility of the tallylog file + format between 32bit and 64bit architectures on multiarch systems. + + + There is no setuid wrapper for access to the data file such as when the + pam_tally2.so module is called from + xscreensaver. As this would make it impossible to share PAM configuration + with such services the following workaround is used: If the data file + cannot be opened because of insufficient permissions + (EPERM) the module returns + PAM_IGNORE. + + + + + EXAMPLES + + Add the following line to /etc/pam.d/login to + lock the account after 4 failed logins. Root account will be locked + as well. The accounts will be automatically unlocked after 20 minutes. + The module does not have to be called in the account phase because the + login calls + pam_setcred3 + correctly. + + +auth required pam_securetty.so +auth required pam_tally2.so deny=4 even_deny_root unlock_time=1200 +auth required pam_env.so +auth required pam_unix.so +auth required pam_nologin.so +account required pam_unix.so +password required pam_unix.so +session required pam_limits.so +session required pam_unix.so +session required pam_lastlog.so nowtmp +session optional pam_mail.so standard + + + + + FILES + + + /var/log/tallylog + + failure count logging file + + + + + + + SEE ALSO + + + pam.conf5 + , + + pam.d5 + , + + pam8 + + + + + + AUTHOR + + pam_tally was written by Tim Baverstock and Tomas Mraz. + + + + + diff --git a/modules/pam_tally2/pam_tally2.c b/modules/pam_tally2/pam_tally2.c new file mode 100644 index 00000000..9ae3180d --- /dev/null +++ b/modules/pam_tally2/pam_tally2.c @@ -0,0 +1,985 @@ +/* + * pam_tally2.c + * + */ + + +/* By Tim Baverstock , Multi Media Machine Ltd. + * 5 March 1997 + * + * Stuff stolen from pam_rootok and pam_listfile + * + * Changes by Tomas Mraz 5 January 2005, 26 January 2006 + * Audit option added for Tomas patch by Sebastien Tricaud 13 January 2005 + * Portions Copyright 2006, Red Hat, Inc. + * Portions Copyright 1989 - 1993, Julianne Frances Haugh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Julianne F. Haugh nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" + +#if defined(MAIN) && defined(MEMORY_DEBUG) +# undef exit +#endif /* defined(MAIN) && defined(MEMORY_DEBUG) */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LIBAUDIT +#include +#endif + +#include +#include +#include +#include "tallylog.h" + +#ifndef TRUE +#define TRUE 1L +#define FALSE 0L +#endif + +#ifndef HAVE_FSEEKO +#define fseeko fseek +#endif + +/* + * here, we make a definition for the externally accessible function + * in this file (this definition is required for static a module + * but strongly encouraged generally) it is used to instruct the + * modules include file to define the function prototypes. + */ + +#ifndef MAIN +#define PAM_SM_AUTH +#define PAM_SM_ACCOUNT +/* #define PAM_SM_SESSION */ +/* #define PAM_SM_PASSWORD */ + +#include +#include +#endif +#include + +/*---------------------------------------------------------------------*/ + +#define DEFAULT_LOGFILE "/var/log/tallylog" +#define MODULE_NAME "pam_tally2" + +#define tally_t uint16_t +#define TALLY_HI ((tally_t)~0L) + +struct tally_options { + const char *filename; + tally_t deny; + long lock_time; + long unlock_time; + long root_unlock_time; + unsigned int ctrl; +}; + +#define PHASE_UNKNOWN 0 +#define PHASE_AUTH 1 +#define PHASE_ACCOUNT 2 +#define PHASE_SESSION 3 + +#define OPT_MAGIC_ROOT 01 +#define OPT_FAIL_ON_ERROR 02 +#define OPT_DENY_ROOT 04 +#define OPT_QUIET 040 +#define OPT_AUDIT 0100 +#define OPT_NOLOGNOTICE 0400 + + +/*---------------------------------------------------------------------*/ + +/* some syslogging */ + +#ifdef MAIN +#define pam_syslog tally_log +static void +tally_log (const pam_handle_t *pamh UNUSED, int priority UNUSED, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + fprintf(stderr, "%s: ", MODULE_NAME); + vfprintf(stderr, fmt, args); + fprintf(stderr,"\n"); + va_end(args); +} + +#define pam_modutil_getpwnam(pamh, user) getpwnam(user) +#endif + +/*---------------------------------------------------------------------*/ + +/* --- Support function: parse arguments --- */ + +#ifndef MAIN + +static void +log_phase_no_auth(pam_handle_t *pamh, int phase, const char *argv) +{ + if ( phase != PHASE_AUTH ) { + pam_syslog(pamh, LOG_ERR, + "option %s allowed in auth phase only", argv); + } +} + +static int +tally_parse_args(pam_handle_t *pamh, struct tally_options *opts, + int phase, int argc, const char **argv) +{ + memset(opts, 0, sizeof(*opts)); + opts->filename = DEFAULT_LOGFILE; + opts->ctrl = OPT_FAIL_ON_ERROR; + opts->root_unlock_time = -1; + + for ( ; argc-- > 0; ++argv ) { + + if ( ! strncmp( *argv, "file=", 5 ) ) { + const char *from = *argv + 5; + if ( *from!='/' ) { + pam_syslog(pamh, LOG_ERR, + "filename not /rooted; %s", *argv); + return PAM_AUTH_ERR; + } + opts->filename = from; + } + else if ( ! strcmp( *argv, "onerr=fail" ) ) { + opts->ctrl |= OPT_FAIL_ON_ERROR; + } + else if ( ! strcmp( *argv, "onerr=succeed" ) ) { + opts->ctrl &= ~OPT_FAIL_ON_ERROR; + } + else if ( ! strcmp( *argv, "magic_root" ) ) { + opts->ctrl |= OPT_MAGIC_ROOT; + } + else if ( ! strcmp( *argv, "even_deny_root_account" ) || + ! strcmp( *argv, "even_deny_root" ) ) { + log_phase_no_auth(pamh, phase, *argv); + opts->ctrl |= OPT_DENY_ROOT; + } + else if ( ! strncmp( *argv, "deny=", 5 ) ) { + log_phase_no_auth(pamh, phase, *argv); + if ( sscanf((*argv)+5,"%hu",&opts->deny) != 1 ) { + pam_syslog(pamh, LOG_ERR, "bad number supplied: %s", *argv); + return PAM_AUTH_ERR; + } + } + else if ( ! strncmp( *argv, "lock_time=", 10 ) ) { + log_phase_no_auth(pamh, phase, *argv); + if ( sscanf((*argv)+10,"%ld",&opts->lock_time) != 1 ) { + pam_syslog(pamh, LOG_ERR, "bad number supplied: %s", *argv); + return PAM_AUTH_ERR; + } + } + else if ( ! strncmp( *argv, "unlock_time=", 12 ) ) { + log_phase_no_auth(pamh, phase, *argv); + if ( sscanf((*argv)+12,"%ld",&opts->unlock_time) != 1 ) { + pam_syslog(pamh, LOG_ERR, "bad number supplied: %s", *argv); + return PAM_AUTH_ERR; + } + } + else if ( ! strncmp( *argv, "root_unlock_time=", 17 ) ) { + log_phase_no_auth(pamh, phase, *argv); + if ( sscanf((*argv)+17,"%ld",&opts->root_unlock_time) != 1 ) { + pam_syslog(pamh, LOG_ERR, "bad number supplied: %s", *argv); + return PAM_AUTH_ERR; + } + opts->ctrl |= OPT_DENY_ROOT; /* even_deny_root implied */ + } + else if ( ! strcmp( *argv, "quiet" ) || + ! strcmp ( *argv, "silent")) { + opts->ctrl |= OPT_QUIET; + } + else if ( ! strcmp ( *argv, "no_log_info") ) { + opts->ctrl |= OPT_NOLOGNOTICE; + } + else if ( ! strcmp ( *argv, "audit") ) { + opts->ctrl |= OPT_AUDIT; + } + else { + pam_syslog(pamh, LOG_ERR, "unknown option: %s", *argv); + } + } + + if (opts->root_unlock_time == -1) + opts->root_unlock_time = opts->unlock_time; + + return PAM_SUCCESS; +} + +#endif /* #ifndef MAIN */ + +/*---------------------------------------------------------------------*/ + +/* --- Support function: get uid (and optionally username) from PAM or + cline_user --- */ + +#ifdef MAIN +static char *cline_user=0; /* cline_user is used in the administration prog */ +#endif + +static int +pam_get_uid(pam_handle_t *pamh, uid_t *uid, const char **userp, struct tally_options *opts) +{ + const char *user = NULL; + struct passwd *pw; + +#ifdef MAIN + user = cline_user; +#else + if ((pam_get_user( pamh, &user, NULL )) != PAM_SUCCESS) { + user = NULL; + } +#endif + + if ( !user || !*user ) { + pam_syslog(pamh, LOG_ERR, "pam_get_uid; user?"); + return PAM_AUTH_ERR; + } + + if ( ! ( pw = pam_modutil_getpwnam( pamh, user ) ) ) { + opts->ctrl & OPT_AUDIT ? + pam_syslog(pamh, LOG_ERR, "pam_get_uid; no such user %s", user) : + pam_syslog(pamh, LOG_ERR, "pam_get_uid; no such user"); + return PAM_USER_UNKNOWN; + } + + if ( uid ) *uid = pw->pw_uid; + if ( userp ) *userp = user; + return PAM_SUCCESS; +} + +/*---------------------------------------------------------------------*/ + +/* --- Support functions: set/get tally data --- */ + +#ifndef MAIN + +static void +_cleanup(pam_handle_t *pamh UNUSED, void *data, int error_status UNUSED) +{ + free(data); +} + + +static void +tally_set_data( pam_handle_t *pamh, time_t oldtime ) +{ + time_t *data; + + if ( (data=malloc(sizeof(time_t))) != NULL ) { + *data = oldtime; + pam_set_data(pamh, MODULE_NAME, (void *)data, _cleanup); + } +} + +static int +tally_get_data( pam_handle_t *pamh, time_t *oldtime ) +{ + int rv; + const void *data; + + rv = pam_get_data(pamh, MODULE_NAME, &data); + if ( rv == PAM_SUCCESS && data != NULL && oldtime != NULL ) { + *oldtime = *(const time_t *)data; + pam_set_data(pamh, MODULE_NAME, NULL, NULL); + } + else { + rv = -1; + *oldtime = 0; + } + return rv; +} +#endif /* #ifndef MAIN */ + +/*---------------------------------------------------------------------*/ + +/* --- Support function: open/create tallyfile and return tally for uid --- */ + +/* If on entry tallyfile doesn't exist, creation is attempted. */ + +static int +get_tally(pam_handle_t *pamh, uid_t uid, const char *filename, + FILE **tfile, struct tallylog *tally) +{ + struct stat fileinfo; + int lstat_ret; + + lstat_ret = lstat(filename, &fileinfo); + if (lstat_ret) { + int save_errno; + int oldmask = umask(077); + *tfile=fopen(filename, "a"); + save_errno = errno; + /* Create file, or append-open in pathological case. */ + umask(oldmask); + if ( !*tfile ) { +#ifndef MAIN + if (save_errno == EPERM) { + return PAM_IGNORE; /* called with insufficient access rights */ + } +#endif + errno = save_errno; + pam_syslog(pamh, LOG_ALERT, "Couldn't create %s: %m", filename); + return PAM_AUTH_ERR; + } + lstat_ret = fstat(fileno(*tfile),&fileinfo); + fclose(*tfile); + *tfile = NULL; + } + + if ( lstat_ret ) { + pam_syslog(pamh, LOG_ALERT, "Couldn't stat %s", filename); + return PAM_AUTH_ERR; + } + + if ((fileinfo.st_mode & S_IWOTH) || !S_ISREG(fileinfo.st_mode)) { + /* If the file is world writable or is not a + normal file, return error */ + pam_syslog(pamh, LOG_ALERT, + "%s is either world writable or not a normal file", + filename); + return PAM_AUTH_ERR; + } + + if (!(*tfile = fopen(filename, "r+"))) { +#ifndef MAIN + if (errno == EPERM) /* called with insufficient access rights */ + return PAM_IGNORE; +#endif + pam_syslog(pamh, LOG_ALERT, "Error opening %s for update: %m", filename); + + return PAM_AUTH_ERR; + } + + if (fseeko(*tfile, (off_t)uid*(off_t)sizeof(*tally), SEEK_SET)) { + pam_syslog(pamh, LOG_ALERT, "fseek failed for %s: %m", filename); + fclose(*tfile); + *tfile = NULL; + return PAM_AUTH_ERR; + } + + if (fileinfo.st_size < (off_t)(uid+1)*(off_t)sizeof(*tally)) { + memset(tally, 0, sizeof(*tally)); + } else if (fread(tally, sizeof(*tally), 1, *tfile) == 0) { + memset(tally, 0, sizeof(*tally)); + /* Shouldn't happen */ + } + + tally->fail_line[sizeof(tally->fail_line)-1] = '\0'; + + return PAM_SUCCESS; +} + +/*---------------------------------------------------------------------*/ + +/* --- Support function: update and close tallyfile with tally!=TALLY_HI --- */ + +static int +set_tally(pam_handle_t *pamh, uid_t uid, + const char *filename, FILE **tfile, struct tallylog *tally) +{ + if (tally->fail_cnt != TALLY_HI) { + if (fseeko(*tfile, (off_t)uid * sizeof(*tally), SEEK_SET)) { + pam_syslog(pamh, LOG_ALERT, "fseek failed for %s: %m", filename); + return PAM_AUTH_ERR; + } + if (fwrite(tally, sizeof(*tally), 1, *tfile) == 0) { + pam_syslog(pamh, LOG_ALERT, "update (fwrite) failed for %s: %m", filename); + return PAM_AUTH_ERR; + } + } + + if (fclose(*tfile)) { + *tfile = NULL; + pam_syslog(pamh, LOG_ALERT, "update (fclose) failed for %s: %m", filename); + return PAM_AUTH_ERR; + } + *tfile=NULL; + return PAM_SUCCESS; +} + +/*---------------------------------------------------------------------*/ + +/* --- PAM bits --- */ + +#ifndef MAIN + +#define RETURN_ERROR(i) return ((opts->ctrl & OPT_FAIL_ON_ERROR)?(i):(PAM_SUCCESS)) + +/*---------------------------------------------------------------------*/ + +static int +tally_check (tally_t oldcnt, time_t oldtime, pam_handle_t *pamh, uid_t uid, + const char *user, struct tally_options *opts, + struct tallylog *tally) +{ + int rv = PAM_SUCCESS; +#ifdef HAVE_LIBAUDIT + char buf[64]; + int audit_fd = -1; +#endif + + if ((opts->ctrl & OPT_MAGIC_ROOT) && getuid() == 0) { + return PAM_SUCCESS; + } + /* magic_root skips tally check */ +#ifdef HAVE_LIBAUDIT + audit_fd = audit_open(); + /* If there is an error & audit support is in the kernel report error */ + if ((audit_fd < 0) && !(errno == EINVAL || errno == EPROTONOSUPPORT || + errno == EAFNOSUPPORT)) + return PAM_SYSTEM_ERR; +#endif + if (opts->deny != 0 && /* deny==0 means no deny */ + tally->fail_cnt > opts->deny && /* tally>deny means exceeded */ + ((opts->ctrl & OPT_DENY_ROOT) || uid)) { /* even_deny stops uid check */ +#ifdef HAVE_LIBAUDIT + if (tally->fail_cnt == opts->deny+1) { + /* First say that max number was hit. */ + snprintf(buf, sizeof(buf), "pam_tally2 uid=%u ", uid); + audit_log_user_message(audit_fd, AUDIT_ANOM_LOGIN_FAILURES, buf, + NULL, NULL, NULL, 1); + } +#endif + if (uid) { + /* Unlock time check */ + if (opts->unlock_time && oldtime) { + if (opts->unlock_time + oldtime <= time(NULL)) { + /* ignore deny check after unlock_time elapsed */ +#ifdef HAVE_LIBAUDIT + snprintf(buf, sizeof(buf), "pam_tally2 uid=%u ", uid); + audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_UNLOCK_TIMED, buf, + NULL, NULL, NULL, 1); +#endif + rv = PAM_SUCCESS; + goto cleanup; + } + } + } else { + /* Root unlock time check */ + if (opts->root_unlock_time && oldtime) { + if (opts->root_unlock_time + oldtime <= time(NULL)) { + /* ignore deny check after unlock_time elapsed */ +#ifdef HAVE_LIBAUDIT + snprintf(buf, sizeof(buf), "pam_tally2 uid=%u ", uid); + audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_UNLOCK_TIMED, buf, + NULL, NULL, NULL, 1); +#endif + rv = PAM_SUCCESS; + goto cleanup; + } + } + } + +#ifdef HAVE_LIBAUDIT + if (tally->fail_cnt == opts->deny+1) { + /* First say that max number was hit. */ + audit_log_user_message(audit_fd, AUDIT_RESP_ACCT_LOCK, buf, + NULL, NULL, NULL, 1); + } +#endif + + if (!(opts->ctrl & OPT_QUIET)) { + pam_info(pamh, _("Account locked due to %hu failed logins"), + tally->fail_cnt); + } + if (!(opts->ctrl & OPT_NOLOGNOTICE)) { + pam_syslog(pamh, LOG_NOTICE, + "user %s (%lu) tally %hu, deny %hu", + user, (unsigned long)uid, tally->fail_cnt, opts->deny); + } + rv = PAM_AUTH_ERR; /* Only unconditional failure */ + goto cleanup; + } + + /* Lock time check */ + if (opts->lock_time && oldtime) { + if (opts->lock_time + oldtime > time(NULL)) { + /* don't increase fail_cnt or update fail_time when + lock_time applies */ + tally->fail_cnt = oldcnt; + tally->fail_time = oldtime; + + if (!(opts->ctrl & OPT_QUIET)) { + pam_info(pamh, _("Account temporary locked (%ld seconds left)"), + oldtime+opts->lock_time-time(NULL)); + } + if (!(opts->ctrl & OPT_NOLOGNOTICE)) { + pam_syslog(pamh, LOG_NOTICE, + "user %s (%lu) has time limit [%lds left]" + " since last failure.", + user, (unsigned long)uid, + oldtime+opts->lock_time-time(NULL)); + } + rv = PAM_AUTH_ERR; + goto cleanup; + } + } + +cleanup: +#ifdef HAVE_LIBAUDIT + if (audit_fd != -1) { + close(audit_fd); + } +#endif + return rv; +} + +/* --- tally bump function: bump tally for uid by (signed) inc --- */ + +static int +tally_bump (int inc, time_t *oldtime, pam_handle_t *pamh, + uid_t uid, const char *user, struct tally_options *opts) +{ + struct tallylog tally; + tally_t oldcnt; + FILE *tfile = NULL; + const void *remote_host = NULL; + int i, rv; + + tally.fail_cnt = 0; /* !TALLY_HI --> Log opened for update */ + + i = get_tally(pamh, uid, opts->filename, &tfile, &tally); + if (i != PAM_SUCCESS) { + if (tfile) + fclose(tfile); + RETURN_ERROR(i); + } + + /* to remember old fail time (for locktime) */ + if (oldtime) { + *oldtime = (time_t)tally.fail_time; + } + + tally.fail_time = time(NULL); + + (void) pam_get_item(pamh, PAM_RHOST, &remote_host); + if (!remote_host) { + (void) pam_get_item(pamh, PAM_TTY, &remote_host); + if (!remote_host) { + remote_host = "unknown"; + } + } + + strncpy(tally.fail_line, remote_host, + sizeof(tally.fail_line)-1); + tally.fail_line[sizeof(tally.fail_line)-1] = 0; + + oldcnt = tally.fail_cnt; + + if (!(opts->ctrl & OPT_MAGIC_ROOT) || getuid()) { + /* magic_root doesn't change tally */ + tally.fail_cnt += inc; + + if (tally.fail_cnt == TALLY_HI) { /* Overflow *and* underflow. :) */ + tally.fail_cnt -= inc; + pam_syslog(pamh, LOG_ALERT, "Tally %sflowed for user %s", + (inc<0)?"under":"over",user); + } + } + + rv = tally_check(oldcnt, *oldtime, pamh, uid, user, opts, &tally); + + i = set_tally(pamh, uid, opts->filename, &tfile, &tally); + if (i != PAM_SUCCESS) { + if (tfile) + fclose(tfile); + if (rv == PAM_SUCCESS) + RETURN_ERROR( i ); + /* fallthrough */ + } + + return rv; +} + +static int +tally_reset (pam_handle_t *pamh, uid_t uid, struct tally_options *opts) +{ + struct tallylog tally; + FILE *tfile = NULL; + int i; + + /* resets only if not magic root */ + + if ((opts->ctrl & OPT_MAGIC_ROOT) && getuid() == 0) { + return PAM_SUCCESS; + } + + tally.fail_cnt = 0; /* !TALLY_HI --> Log opened for update */ + + i=get_tally(pamh, uid, opts->filename, &tfile, &tally); + if (i != PAM_SUCCESS) { + if (tfile) + fclose(tfile); + RETURN_ERROR(i); + } + + memset(&tally, 0, sizeof(tally)); + + i=set_tally(pamh, uid, opts->filename, &tfile, &tally); + if (i != PAM_SUCCESS) { + if (tfile) + fclose(tfile); + RETURN_ERROR(i); + } + + return PAM_SUCCESS; +} + +/*---------------------------------------------------------------------*/ + +/* --- authentication management functions (only) --- */ + +PAM_EXTERN int +pam_sm_authenticate(pam_handle_t *pamh, int flags UNUSED, + int argc, const char **argv) +{ + int + rv; + time_t + oldtime = 0; + struct tally_options + options, *opts = &options; + uid_t + uid; + const char + *user; + + rv = tally_parse_args(pamh, opts, PHASE_AUTH, argc, argv); + if (rv != PAM_SUCCESS) + RETURN_ERROR(rv); + + if (flags & PAM_SILENT) + opts->ctrl |= OPT_QUIET; + + rv = pam_get_uid(pamh, &uid, &user, opts); + if (rv != PAM_SUCCESS) + RETURN_ERROR(rv); + + rv = tally_bump(1, &oldtime, pamh, uid, user, opts); + + tally_set_data(pamh, oldtime); + + return rv; +} + +PAM_EXTERN int +pam_sm_setcred(pam_handle_t *pamh, int flags UNUSED, + int argc, const char **argv) +{ + int + rv; + time_t + oldtime = 0; + struct tally_options + options, *opts = &options; + uid_t + uid; + const char + *user; + + rv = tally_parse_args(pamh, opts, PHASE_AUTH, argc, argv); + if ( rv != PAM_SUCCESS ) + RETURN_ERROR( rv ); + + rv = pam_get_uid(pamh, &uid, &user, opts); + if ( rv != PAM_SUCCESS ) + RETURN_ERROR( rv ); + + if ( tally_get_data(pamh, &oldtime) != 0 ) + /* no data found */ + return PAM_SUCCESS; + + return tally_reset(pamh, uid, opts); +} + +/*---------------------------------------------------------------------*/ + +/* --- authentication management functions (only) --- */ + +/* To reset failcount of user on successfull login */ + +PAM_EXTERN int +pam_sm_acct_mgmt(pam_handle_t *pamh, int flags UNUSED, + int argc, const char **argv) +{ + int + rv; + time_t + oldtime = 0; + struct tally_options + options, *opts = &options; + uid_t + uid; + const char + *user; + + rv = tally_parse_args(pamh, opts, PHASE_ACCOUNT, argc, argv); + if ( rv != PAM_SUCCESS ) + RETURN_ERROR( rv ); + + rv = pam_get_uid(pamh, &uid, &user, opts); + if ( rv != PAM_SUCCESS ) + RETURN_ERROR( rv ); + + if ( tally_get_data(pamh, &oldtime) != 0 ) + /* no data found */ + return PAM_SUCCESS; + + return tally_reset(pamh, uid, opts); +} + +/*-----------------------------------------------------------------------*/ + +#ifdef PAM_STATIC + +/* static module data */ + +struct pam_module _pam_tally_modstruct = { + MODULE_NAME, +#ifdef PAM_SM_AUTH + pam_sm_authenticate, + pam_sm_setcred, +#else + NULL, + NULL, +#endif +#ifdef PAM_SM_ACCOUNT + pam_sm_acct_mgmt, +#else + NULL, +#endif + NULL, + NULL, + NULL, +}; + +#endif /* #ifdef PAM_STATIC */ + +/*-----------------------------------------------------------------------*/ + +#else /* #ifndef MAIN */ + +static const char *cline_filename = DEFAULT_LOGFILE; +static tally_t cline_reset = TALLY_HI; /* Default is `interrogate only' */ +static int cline_quiet = 0; + +/* + * Not going to link with pamlib just for these.. :) + */ + +static const char * +pam_errors( int i ) +{ + switch (i) { + case PAM_AUTH_ERR: return _("Authentication error"); + case PAM_SERVICE_ERR: return _("Service error"); + case PAM_USER_UNKNOWN: return _("Unknown user"); + default: return _("Unknown error"); + } +} + +static int +getopts( char **argv ) +{ + const char *pname = *argv; + for ( ; *argv ; (void)(*argv && ++argv) ) { + if ( !strcmp (*argv,"--file") ) cline_filename=*++argv; + else if ( !strcmp(*argv,"-f") ) cline_filename=*++argv; + else if ( !strncmp(*argv,"--file=",7) ) cline_filename=*argv+7; + else if ( !strcmp (*argv,"--user") ) cline_user=*++argv; + else if ( !strcmp (*argv,"-u") ) cline_user=*++argv; + else if ( !strncmp(*argv,"--user=",7) ) cline_user=*argv+7; + else if ( !strcmp (*argv,"--reset") ) cline_reset=0; + else if ( !strcmp (*argv,"-r") ) cline_reset=0; + else if ( !strncmp(*argv,"--reset=",8)) { + if ( sscanf(*argv+8,"%hu",&cline_reset) != 1 ) + fprintf(stderr,_("%s: Bad number given to --reset=\n"),pname), exit(0); + } + else if ( !strcmp (*argv,"--quiet") ) cline_quiet=1; + else { + fprintf(stderr,_("%s: Unrecognised option %s\n"),pname,*argv); + return FALSE; + } + } + return TRUE; +} + +static void +print_one(const struct tallylog *tally, uid_t uid) +{ + static int once; + char *cp; + time_t fail_time; + struct tm *tm; + struct passwd *pwent; + const char *username = "[NONAME]"; + char ptime[80]; + + pwent = getpwuid(uid); + fail_time = tally->fail_time; + tm = localtime(&fail_time); + strftime (ptime, sizeof (ptime), "%D %H:%M:%S", tm); + cp = ptime; + if (pwent) { + username = pwent->pw_name; + } + if (!once) { + printf (_("Login Failures Latest failure From\n")); + once++; + } + printf ("%-15.15s %5hu ", username, tally->fail_cnt); + if (tally->fail_time) { + printf ("%-17.17s %s", cp, tally->fail_line); + } + putchar ('\n'); +} + +int +main( int argc UNUSED, char **argv ) +{ + struct tallylog tally; + + if ( ! getopts( argv+1 ) ) { + printf(_("%s: [-f rooted-filename] [--file rooted-filename]\n" + " [-u username] [--user username]\n" + " [-r] [--reset[=n]] [--quiet]\n"), + *argv); + exit(2); + } + + umask(077); + + /* + * Major difference between individual user and all users: + * --user just handles one user, just like PAM. + * without --user it handles all users, sniffing cline_filename for nonzeros + */ + + if ( cline_user ) { + uid_t uid; + FILE *tfile=0; + struct tally_options opts; + int i; + + memset(&opts, 0, sizeof(opts)); + opts.ctrl = OPT_AUDIT; + i=pam_get_uid(NULL, &uid, NULL, &opts); + if ( i != PAM_SUCCESS ) { + fprintf(stderr,"%s: %s\n",*argv,pam_errors(i)); + exit(1); + } + + i=get_tally(NULL, uid, cline_filename, &tfile, &tally); + if ( i != PAM_SUCCESS ) { + if (tfile) + fclose(tfile); + fprintf(stderr, "%s: %s\n", *argv, pam_errors(i)); + exit(1); + } + + if ( !cline_quiet ) + print_one(&tally, uid); + + if (cline_reset != TALLY_HI) { +#ifdef HAVE_LIBAUDIT + char buf[64]; + int audit_fd = audit_open(); + snprintf(buf, sizeof(buf), "pam_tally2 uid=%u reset=%hu", uid, cline_reset); + audit_log_user_message(audit_fd, AUDIT_USER_ACCT, + buf, NULL, NULL, NULL, 1); + if (audit_fd >=0) + close(audit_fd); +#endif + if (cline_reset == 0) { + memset(&tally, 0, sizeof(tally)); + } else { + tally.fail_cnt = cline_reset; + } + i=set_tally(NULL, uid, cline_filename, &tfile, &tally); + if (i != PAM_SUCCESS) { + if (tfile) fclose(tfile); + fprintf(stderr,"%s: %s\n",*argv,pam_errors(i)); + exit(1); + } + } else { + fclose(tfile); + } + } + else /* !cline_user (ie, operate on all users) */ { + FILE *tfile=fopen(cline_filename, "r"); + uid_t uid=0; + if (!tfile && cline_reset != 0) { + perror(*argv); + exit(1); + } + + for ( ; tfile && !feof(tfile); uid++ ) { + if ( !fread(&tally, sizeof(tally), 1, tfile) + || !tally.fail_cnt ) { + continue; + } + print_one(&tally, uid); + } + if (tfile) + fclose(tfile); + if ( cline_reset!=0 && cline_reset!=TALLY_HI ) { + fprintf(stderr,_("%s: Can't reset all users to non-zero\n"),*argv); + } + else if ( !cline_reset ) { +#ifdef HAVE_LIBAUDIT + char buf[64]; + int audit_fd = audit_open(); + snprintf(buf, sizeof(buf), "pam_tally2 uid=all reset=0"); + audit_log_user_message(audit_fd, AUDIT_USER_ACCT, + buf, NULL, NULL, NULL, 1); + if (audit_fd >=0) + close(audit_fd); +#endif + tfile=fopen(cline_filename, "w"); + if ( !tfile ) perror(*argv), exit(0); + fclose(tfile); + } + } + return 0; +} + + +#endif /* #ifndef MAIN */ diff --git a/modules/pam_tally2/pam_tally2_app.c b/modules/pam_tally2/pam_tally2_app.c new file mode 100644 index 00000000..681ed690 --- /dev/null +++ b/modules/pam_tally2/pam_tally2_app.c @@ -0,0 +1,7 @@ +/* + # This seemed like such a good idea at the time. :) + */ + +#define MAIN +#include "pam_tally2.c" + diff --git a/modules/pam_tally2/tallylog.h b/modules/pam_tally2/tallylog.h new file mode 100644 index 00000000..596b1dac --- /dev/null +++ b/modules/pam_tally2/tallylog.h @@ -0,0 +1,52 @@ +/* + * Copyright 2006, Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Red Hat, Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY RED HAT, INC. AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * tallylog.h - login failure data file format + * + * The new login failure file is not compatible with the old faillog(8) format + * Each record in the file represents a separate UID and the file + * is indexed in that fashion. + */ + + +#ifndef _TALLYLOG_H +#define _TALLYLOG_H + +#include + +struct tallylog { + char fail_line[52]; /* rhost or tty of last failure */ + uint16_t reserved; /* reserved for future use */ + uint16_t fail_cnt; /* failures since last success */ + uint64_t fail_time; /* time of last failure */ +}; +/* 64 bytes / entry */ + +#endif diff --git a/modules/pam_tally2/tst-pam_tally2 b/modules/pam_tally2/tst-pam_tally2 new file mode 100755 index 00000000..83c71f41 --- /dev/null +++ b/modules/pam_tally2/tst-pam_tally2 @@ -0,0 +1,2 @@ +#!/bin/sh +../../tests/tst-dlopen .libs/pam_tally2.so diff --git a/po/POTFILES.in b/po/POTFILES.in index 39889b06..5ca1caa9 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -71,6 +71,8 @@ ./modules/pam_succeed_if/pam_succeed_if.c ./modules/pam_tally/pam_tally_app.c ./modules/pam_tally/pam_tally.c +./modules/pam_tally2/pam_tally2_app.c +./modules/pam_tally2/pam_tally2.c ./modules/pam_time/pam_time.c ./modules/pam_tty_audit/pam_tty_audit.c ./modules/pam_umask/pam_umask.c -- cgit v1.2.3 From 4a67d64dd0cb01c40e675f48f0c6ea3d08e53664 Mon Sep 17 00:00:00 2001 From: Tomas Mraz Date: Fri, 28 Nov 2008 14:29:12 +0000 Subject: Relevant BUGIDs: Purpose of commit: new feature Commit summary: --------------- 2008-11-28 Tomas Mraz * modules/pam_tally2/pam_tally2.c (tally_check): Fix info format to be the same as in pam_tally. * configure.in: Add modules/pam_timestamp/Makefile. * doc/sag/Linux-PAM_SAG.xml: Include pam_timestamp.xml. * doc/sag/pam_timestamp.xml: New. * libpam/pam_static_modules.h: Add pam_timestamp static struct. * modules/Makefile.am: Add pam_timestamp directory. * modules/pam_timestamp/Makefile.am: New. * modules/pam_timestamp/README.xml: New. * modules/pam_timestamp/hmacsha1.h: New. * modules/pam_timestamp/sha1.h: New. * modules/pam_timestamp/pam_timestamp.8.xml: New. * modules/pam_timestamp/pam_timestamp_check.8.xml: New. * modules/pam_timestamp/pam_timestamp.c: New. * modules/pam_timestamp/pam_timestamp_check.c: New. * modules/pam_timestamp/hmacfile.c: New. * modules/pam_timestamp/hmacsha1.c: New. * modules/pam_timestamp/sha1.c: New. * modules/pam_timestamp/tst-pam_timestamp: New. * po/POTFILES.in: Add pam_timestamp sources. * po/*.po: Regenerate. * po/cs.po: Updated translations. --- ChangeLog | 24 + NEWS | 2 + configure.in | 4 +- doc/sag/Linux-PAM_SAG.xml | 2 + doc/sag/pam_timestamp.xml | 42 ++ libpam/pam_static_modules.h | 2 + modules/Makefile.am | 3 +- modules/pam_tally2/pam_tally2.c | 4 +- modules/pam_timestamp/Makefile.am | 47 ++ modules/pam_timestamp/README.xml | 46 ++ modules/pam_timestamp/hmacfile.c | 157 +++++ modules/pam_timestamp/hmacsha1.c | 293 +++++++++ modules/pam_timestamp/hmacsha1.h | 15 + modules/pam_timestamp/pam_timestamp.8.xml | 189 ++++++ modules/pam_timestamp/pam_timestamp.c | 816 ++++++++++++++++++++++++ modules/pam_timestamp/pam_timestamp_check.8.xml | 208 ++++++ modules/pam_timestamp/pam_timestamp_check.c | 42 ++ modules/pam_timestamp/sha1.c | 254 ++++++++ modules/pam_timestamp/sha1.h | 60 ++ modules/pam_timestamp/tst-pam_timestamp | 2 + po/Linux-PAM.pot | 38 +- po/POTFILES.in | 2 + po/ar.po | 38 +- po/as.po | 38 +- po/bn_IN.po | 42 +- po/ca.po | 45 +- po/cs.po | 51 +- po/da.po | 38 +- po/de.po | 41 +- po/es.po | 38 +- po/fi.po | 38 +- po/fr.po | 42 +- po/gu.po | 38 +- po/hi.po | 38 +- po/hu.po | 38 +- po/it.po | 42 +- po/ja.po | 42 +- po/km.po | 38 +- po/kn.po | 42 +- po/ko.po | 38 +- po/ml.po | 42 +- po/mr.po | 38 +- po/ms.po | 38 +- po/nb.po | 38 +- po/nl.po | 42 +- po/or.po | 38 +- po/pa.po | 38 +- po/pl.po | 42 +- po/pt.po | 38 +- po/pt_BR.po | 42 +- po/ru.po | 38 +- po/si.po | 38 +- po/sk.po | 42 +- po/sr.po | 38 +- po/sr@latin.po | 38 +- po/sv.po | 38 +- po/ta.po | 38 +- po/te.po | 42 +- po/tr.po | 38 +- po/uk.po | 38 +- po/zh_CN.po | 42 +- po/zh_TW.po | 38 +- po/zu.po | 38 +- 63 files changed, 3071 insertions(+), 810 deletions(-) create mode 100644 doc/sag/pam_timestamp.xml create mode 100644 modules/pam_timestamp/Makefile.am create mode 100644 modules/pam_timestamp/README.xml create mode 100644 modules/pam_timestamp/hmacfile.c create mode 100644 modules/pam_timestamp/hmacsha1.c create mode 100644 modules/pam_timestamp/hmacsha1.h create mode 100644 modules/pam_timestamp/pam_timestamp.8.xml create mode 100644 modules/pam_timestamp/pam_timestamp.c create mode 100644 modules/pam_timestamp/pam_timestamp_check.8.xml create mode 100644 modules/pam_timestamp/pam_timestamp_check.c create mode 100644 modules/pam_timestamp/sha1.c create mode 100644 modules/pam_timestamp/sha1.h create mode 100755 modules/pam_timestamp/tst-pam_timestamp (limited to 'libpam/pam_static_modules.h') diff --git a/ChangeLog b/ChangeLog index dc4ef37f..f58ef8a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,30 @@ * modules/pam_unix/unix_update.c (set_password): Allow root to change passwords without verification of the old ones. + * modules/pam_tally2/pam_tally2.c (tally_check): Fix info format + to be the same as in pam_tally. + + * configure.in: Add modules/pam_timestamp/Makefile. + * doc/sag/Linux-PAM_SAG.xml: Include pam_timestamp.xml. + * doc/sag/pam_timestamp.xml: New. + * libpam/pam_static_modules.h: Add pam_timestamp static struct. + * modules/Makefile.am: Add pam_timestamp directory. + * modules/pam_timestamp/Makefile.am: New. + * modules/pam_timestamp/README.xml: New. + * modules/pam_timestamp/hmacsha1.h: New. + * modules/pam_timestamp/sha1.h: New. + * modules/pam_timestamp/pam_timestamp.8.xml: New. + * modules/pam_timestamp/pam_timestamp_check.8.xml: New. + * modules/pam_timestamp/pam_timestamp.c: New. + * modules/pam_timestamp/pam_timestamp_check.c: New. + * modules/pam_timestamp/hmacfile.c: New. + * modules/pam_timestamp/hmacsha1.c: New. + * modules/pam_timestamp/sha1.c: New. + * modules/pam_timestamp/tst-pam_timestamp: New. + * po/POTFILES.in: Add pam_timestamp sources. + * po/*.po: Regenerate. + * po/cs.po: Updated translations. + 2008-11-25 Thorsten Kukuk * modules/pam_pwhistory/opasswd.c (save_old_password): Fix typo. diff --git a/NEWS b/NEWS index 932d90c8..e3f5623c 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,8 @@ Release 1.0.90 * New pam_tally2 module similar to pam_tally with wordsize independent tally data format * Make libpam not log missing module if its type is prepended with '-' +* New pam_timestamp module for authentication based on recent successful + login. Release 1.0.2 diff --git a/configure.in b/configure.in index 087d88cf..b220a9a2 100644 --- a/configure.in +++ b/configure.in @@ -548,8 +548,8 @@ AC_CONFIG_FILES([Makefile libpam/Makefile libpamc/Makefile libpamc/test/Makefile modules/pam_sepermit/Makefile \ modules/pam_shells/Makefile modules/pam_stress/Makefile \ modules/pam_succeed_if/Makefile modules/pam_tally/Makefile \ - modules/pam_tally2/Makefile \ - modules/pam_time/Makefile modules/pam_tty_audit/Makefile \ + modules/pam_tally2/Makefile modules/pam_time/Makefile \ + modules/pam_timestamp/Makefile modules/pam_tty_audit/Makefile \ modules/pam_umask/Makefile \ modules/pam_unix/Makefile modules/pam_userdb/Makefile \ modules/pam_warn/Makefile modules/pam_wheel/Makefile \ diff --git a/doc/sag/Linux-PAM_SAG.xml b/doc/sag/Linux-PAM_SAG.xml index a1989c9a..b83355ef 100644 --- a/doc/sag/Linux-PAM_SAG.xml +++ b/doc/sag/Linux-PAM_SAG.xml @@ -462,6 +462,8 @@ session required pam_warn.so href="pam_tally2.xml"/> + + +
+ pam_timestamp - authenticate using cached successful authentication attempts + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/libpam/pam_static_modules.h b/libpam/pam_static_modules.h index 2d80cecb..999adc2a 100644 --- a/libpam/pam_static_modules.h +++ b/libpam/pam_static_modules.h @@ -76,6 +76,7 @@ extern struct pam_module _pam_succeed_if_modstruct; extern struct pam_module _pam_tally_modstruct; extern struct pam_module _pam_tally2_modstruct; extern struct pam_module _pam_time_modstruct; +extern struct pam_module _pam_timestamp_modstruct; #ifdef HAVE_AUDIT_TTY_STATUS extern struct pam_module _pam_tty_audit_modstruct; #endif @@ -136,6 +137,7 @@ static struct pam_module *static_modules[] = { &_pam_tally_modstruct, &_pam_tally2_modstruct, &_pam_time_modstruct, + &_pam_timestamp_modstruct, #ifdef HAVE_AUDIT_TTY_STATUS &_pam_tty_audit_modstruct, #endif diff --git a/modules/Makefile.am b/modules/Makefile.am index 37d5a739..0c80cea9 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -9,7 +9,8 @@ SUBDIRS = pam_access pam_cracklib pam_debug pam_deny pam_echo \ pam_mkhomedir pam_motd pam_namespace pam_nologin \ pam_permit pam_pwhistory pam_rhosts pam_rootok pam_securetty \ pam_selinux pam_sepermit pam_shells pam_stress \ - pam_succeed_if pam_tally pam_tally2 pam_time pam_tty_audit pam_umask \ + pam_succeed_if pam_tally pam_tally2 pam_time pam_timestamp \ + pam_tty_audit pam_umask \ pam_unix pam_userdb pam_warn pam_wheel pam_xauth CLEANFILES = *~ diff --git a/modules/pam_tally2/pam_tally2.c b/modules/pam_tally2/pam_tally2.c index 9ae3180d..5924edf9 100644 --- a/modules/pam_tally2/pam_tally2.c +++ b/modules/pam_tally2/pam_tally2.c @@ -517,8 +517,8 @@ tally_check (tally_t oldcnt, time_t oldtime, pam_handle_t *pamh, uid_t uid, #endif if (!(opts->ctrl & OPT_QUIET)) { - pam_info(pamh, _("Account locked due to %hu failed logins"), - tally->fail_cnt); + pam_info(pamh, _("Account locked due to %u failed logins"), + (unsigned int)tally->fail_cnt); } if (!(opts->ctrl & OPT_NOLOGNOTICE)) { pam_syslog(pamh, LOG_NOTICE, diff --git a/modules/pam_timestamp/Makefile.am b/modules/pam_timestamp/Makefile.am new file mode 100644 index 00000000..51a3c215 --- /dev/null +++ b/modules/pam_timestamp/Makefile.am @@ -0,0 +1,47 @@ +# +# Copyright (c) 2005 Thorsten Kukuk +# Copyright (c) 2005 Red Hat, Inc. +# + +CLEANFILES = *~ + +XMLS = README.xml pam_timestamp.8.xml pam_timestamp_check.8.xml +man_MANS = pam_timestamp.8 pam_timestamp_check.8 +TESTS = tst-pam_timestamp + +EXTRA_DIST = $(man_MANS) hmactest.c $(XMLS) $(TESTS) + +securelibdir = $(SECUREDIR) +secureconfdir = $(SCONFIGDIR) + +noinst_HEADERS = hmacsha1.h sha1.h + +AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include + +pam_timestamp_la_LDFLAGS = -no-undefined -avoid-version -module $(AM_LDFLAGS) +pam_timestamp_la_LIBADD = -L$(top_builddir)/libpam -lpam +if HAVE_VERSIONING + pam_timestamp_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map +endif + +securelib_LTLIBRARIES = pam_timestamp.la +sbin_PROGRAMS = pam_timestamp_check + +pam_timestamp_la_SOURCES = pam_timestamp.c hmacsha1.c sha1.c +pam_timestamp_la_CFLAGS = $(AM_CFLAGS) + +pam_timestamp_check_SOURCES = pam_timestamp_check.c +pam_timestamp_check_CFLAGS = $(AM_CFLAGS) @PIE_CFLAGS@ +pam_timestamp_check_LDADD = -L$(top_builddir)/libpam -lpam +pam_timestamp_check_LDFLAGS = @PIE_LDFLAGS@ + +hmacfile_SOURCES = hmacfile.c hmacsha1.c sha1.c +hmacfile_LDADD = -L$(top_builddir)/libpam -lpam + +if ENABLE_REGENERATE_MAN +noinst_DATA = README +README: pam_timestamp.8.xml +-include $(top_srcdir)/Make.xml.rules +endif + +noinst_PROGRAMS = hmacfile diff --git a/modules/pam_timestamp/README.xml b/modules/pam_timestamp/README.xml new file mode 100644 index 00000000..5b72deb1 --- /dev/null +++ b/modules/pam_timestamp/README.xml @@ -0,0 +1,46 @@ + + +--> +]> + +
+ + + + + <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" + href="pam_timestamp.8.xml" xpointer='xpointer(//refnamediv[@id = "pam_timestamp-name"]/*)'/> + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
diff --git a/modules/pam_timestamp/hmacfile.c b/modules/pam_timestamp/hmacfile.c new file mode 100644 index 00000000..963f6f54 --- /dev/null +++ b/modules/pam_timestamp/hmacfile.c @@ -0,0 +1,157 @@ +/* + * Copyright 2003,2004 Red Hat, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "hmacsha1.h" + +static void +testvectors(void) +{ + void *hmac; + size_t hmac_len; + size_t i, j; + char hex[3]; + struct vector { + const char *key; + int key_len; + const char *data; + int data_len; + const char *hmac; + } vectors[] = { + { + "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20, + "Hi There", 8, + "b617318655057264e28bc0b6fb378c8ef146be00", + }, + + { + "Jefe", 4, + "what do ya want for nothing?", 28, + "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79", + }, + + { + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20, + "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", 50, + "125d7342b9ac11cd91a39af48aa17b4f63f175d3", + }, + + { + "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", 25, + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", + 50, + "4c9007f4026250c6bc8414f9bf50c86c2d7235da", + }, + + { + "\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20, + "Test With Truncation", 20, + "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04", + }, + + { + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + 80, + "Test Using Larger Than Block-Size Key - Hash Key First", 54, + "aa4ae5e15272d00e95705637ce8a3b55ed402112", + }, + + { + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + 80, + "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73, + "e8e99d0f45237d786d6bbaa7965c7808bbff1a91", + }, + }; + for (i = 0; i < sizeof(vectors) / sizeof(vectors[0]); i++) { + hmac = NULL; + hmac_len = 0; + hmac_sha1_generate(&hmac, &hmac_len, + vectors[i].key, vectors[i].key_len, + vectors[i].data, vectors[i].data_len); + if (hmac != NULL) { + unsigned char *hmacc = hmac; + for (j = 0; j < hmac_len; j++) { + snprintf(hex, sizeof(hex), "%02x", + hmacc[j] & 0xff); + if (strncasecmp(hex, + vectors[i].hmac + 2 * j, + 2) != 0) { + printf("Incorrect result for vector %lu\n", i + 1); + exit(1); + + } + } + free(hmac); + } else { + printf("Error in vector %lu.\n", i + 1); + exit(1); + } + } +} + +int +main(int argc, char **argv) +{ + void *hmac; + size_t maclen; + const char *keyfile; + int i; + size_t j; + + testvectors(); + + keyfile = argv[1]; + for (i = 2; i < argc; i++) { + hmac_sha1_generate_file(NULL, &hmac, &maclen, keyfile, -1, -1, + argv[i], strlen(argv[i])); + if (hmac != NULL) { + unsigned char *hmacc = hmac; + for (j = 0; j < maclen; j++) { + printf("%02x", hmacc[j] & 0xff); + } + printf(" %s\n", argv[i]); + free(hmac); + } + } + return 0; +} diff --git a/modules/pam_timestamp/hmacsha1.c b/modules/pam_timestamp/hmacsha1.c new file mode 100644 index 00000000..5b3774ff --- /dev/null +++ b/modules/pam_timestamp/hmacsha1.c @@ -0,0 +1,293 @@ +/* An implementation of HMAC using SHA-1. + * + * Copyright (c) 2003 Red Hat, Inc. + * Written by Nalin Dahyabhai + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/* See RFC 2104 for descriptions. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hmacsha1.h" +#include "sha1.h" + +#define MINIMUM_KEY_SIZE SHA1_OUTPUT_SIZE +#define MAXIMUM_KEY_SIZE SHA1_BLOCK_SIZE + +static void +hmac_key_create(pam_handle_t *pamh, const char *filename, size_t key_size, + uid_t owner, gid_t group) +{ + int randfd, keyfd, i; + size_t count; + char *key; + + /* Open the destination file. */ + keyfd = open(filename, + O_WRONLY | O_CREAT | O_EXCL | O_TRUNC, + S_IRUSR | S_IWUSR); + if (keyfd == -1) { + pam_syslog(pamh, LOG_ERR, "Cannot create %s: %m", filename); + return; + } + + + if (fchown(keyfd, owner, group) == -1) { + pam_syslog(pamh, LOG_ERR, "Cannot chown %s: %m", filename); + return; + } + + /* Open the random device to get key data. */ + randfd = open("/dev/urandom", O_RDONLY); + if (randfd == -1) { + pam_syslog(pamh, LOG_ERR, "Cannot open /dev/urandom: %m"); + close(keyfd); + return; + } + + /* Read random data for use as the key. */ + key = malloc(key_size); + count = 0; + if (!key) { + close(keyfd); + close(randfd); + return; + } + while (count < key_size) { + i = read(randfd, key + count, key_size - count); + if ((i == 0) || (i == -1)) { + break; + } + count += i; + } + + close(randfd); + + /* If we didn't get enough, stop here. */ + if (count < key_size) { + pam_syslog(pamh, LOG_ERR, "Short read on random device"); + memset(key, 0, key_size); + free(key); + close(keyfd); + return; + } + + /* Now write the key. */ + count = 0; + while (count < key_size) { + i = write(keyfd, key + count, key_size - count); + if ((i == 0) || (i == -1)) { + break; + } + count += i; + } + memset(key, 0, key_size); + free(key); + close(keyfd); +} + +static void +hmac_key_read(pam_handle_t *pamh, const char *filename, size_t default_key_size, + uid_t owner, gid_t group, + void **key, size_t *key_size) +{ + char *tmp; + int keyfd, i, count; + struct stat st; + + tmp = NULL; + *key = NULL; + *key_size = 0; + + /* Try to open the key file. */ + keyfd = open(filename, O_RDONLY); + if (keyfd == -1) { + /* No such thing? Create it. */ + if (errno == ENOENT) { + hmac_key_create(pamh, filename, default_key_size, + owner, group); + keyfd = open(filename, O_RDONLY); + } else { + pam_syslog(pamh, LOG_ERR, "Cannot open %s: %m", filename); + } + if (keyfd == -1) + return; + } + + /* If we failed to open the file, we're done. */ + if (fstat(keyfd, &st) == -1) { + close(keyfd); + return; + } + + /* Read the contents of the file. */ + tmp = malloc(st.st_size); + if (!tmp) { + close(keyfd); + return; + } + + count = 0; + while (count < st.st_size) { + i = read(keyfd, tmp + count, st.st_size - count); + if ((i == 0) || (i == -1)) { + break; + } + count += i; + } + close(keyfd); + + /* Require that we got the expected amount of data. */ + if (count < st.st_size) { + memset(tmp, 0, st.st_size); + free(tmp); + return; + } + + /* Pass the key back. */ + *key = tmp; + *key_size = st.st_size; +} + +static void +xor_block(unsigned char *p, unsigned char byte, size_t length) +{ + size_t i; + for (i = 0; i < length; i++) { + p[i] = p[i] ^ byte; + } +} + +void +hmac_sha1_generate(void **mac, size_t *mac_length, + const void *raw_key, size_t raw_key_size, + const void *text, size_t text_length) +{ + unsigned char key[MAXIMUM_KEY_SIZE], tmp_key[MAXIMUM_KEY_SIZE]; + size_t maximum_key_size = SHA1_BLOCK_SIZE, + minimum_key_size = SHA1_OUTPUT_SIZE; + const unsigned char ipad = 0x36, opad = 0x5c; + struct sha1_context sha1; + unsigned char inner[SHA1_OUTPUT_SIZE], outer[SHA1_OUTPUT_SIZE]; + + *mac = NULL; + *mac_length = 0; + +#ifndef HMAC_ALLOW_SHORT_KEYS + /* If the key is too short, don't bother. */ + if (raw_key_size < minimum_key_size) { + return; + } +#endif + + /* If the key is too long, "compress" it, else copy it and pad it + * out with zero bytes. */ + memset(key, 0, sizeof(key)); + if (raw_key_size > maximum_key_size) { + sha1_init(&sha1); + sha1_update(&sha1, raw_key, raw_key_size); + sha1_output(&sha1, key); + } else { + memmove(key, raw_key, raw_key_size); + } + + /* Generate the inner sum. */ + memcpy(tmp_key, key, sizeof(tmp_key)); + xor_block(tmp_key, ipad, sizeof(tmp_key)); + + sha1_init(&sha1); + sha1_update(&sha1, tmp_key, sizeof(tmp_key)); + sha1_update(&sha1, text, text_length); + sha1_output(&sha1, inner); + + /* Generate the outer sum. */ + memcpy(tmp_key, key, sizeof(tmp_key)); + xor_block(tmp_key, opad, sizeof(tmp_key)); + + sha1_init(&sha1); + sha1_update(&sha1, tmp_key, sizeof(tmp_key)); + sha1_update(&sha1, inner, sizeof(inner)); + sha1_output(&sha1, outer); + + /* We don't need any of the keys any more. */ + memset(key, 0, sizeof(key)); + memset(tmp_key, 0, sizeof(tmp_key)); + + /* Allocate space to store the output. */ + *mac_length = sizeof(outer); + *mac = malloc(*mac_length); + if (*mac == NULL) { + *mac_length = 0; + return; + } + + memcpy(*mac, outer, *mac_length); +} + +void +hmac_sha1_generate_file(pam_handle_t *pamh, void **mac, size_t *mac_length, + const char *keyfile, uid_t owner, gid_t group, + const void *text, size_t text_length) +{ + void *key; + size_t key_length; + + hmac_key_read(pamh, keyfile, + MAXIMUM_KEY_SIZE, owner, group, + &key, &key_length); + if (key == NULL) { + *mac = NULL; + *mac_length = 0; + return; + } + hmac_sha1_generate(mac, mac_length, + key, key_length, + text, text_length); + memset(key, 0, key_length); + free(key); +} + +size_t +hmac_sha1_size(void) +{ + return SHA1_OUTPUT_SIZE; +} diff --git a/modules/pam_timestamp/hmacsha1.h b/modules/pam_timestamp/hmacsha1.h new file mode 100644 index 00000000..200d1d06 --- /dev/null +++ b/modules/pam_timestamp/hmacsha1.h @@ -0,0 +1,15 @@ +#ifndef pam_timestamp_hmacfile_h +#define pam_timestamp_hmacfile_h + +#include +#include + +size_t hmac_sha1_size(void); +void hmac_sha1_generate(void **mac, size_t *mac_length, + const void *key, size_t key_length, + const void *text, size_t text_length); +void hmac_sha1_generate_file(pam_handle_t *pamh, void **mac, size_t *mac_length, + const char *keyfile, uid_t owner, gid_t group, + const void *text, size_t text_length); + +#endif diff --git a/modules/pam_timestamp/pam_timestamp.8.xml b/modules/pam_timestamp/pam_timestamp.8.xml new file mode 100644 index 00000000..c96424ab --- /dev/null +++ b/modules/pam_timestamp/pam_timestamp.8.xml @@ -0,0 +1,189 @@ + + + + + + + pam_timestamp + 8 + Linux-PAM Manual + + + + pam_timestamp + Authenticate using cached successful authentication attempts + + + + + pam_timestamp.so + + timestamp_timeout=number + + + verbose + + + debug + + + + + + + DESCRIPTION + + + In a nutshell, pam_timestamp caches successful +authentication attempts, and allows you to use a recent successful attempt as +the basis for authentication. This is similar mechanism which is used in +sudo. + + + When an application opens a session using pam_timestamp, +a timestamp file is created in the timestampdir directory +for the user. When an application attempts to authenticate the user, a +pam_timestamp will treat a sufficiently recent timestamp +file as grounds for succeeding. + + + + + + OPTIONS + + + + + + + + How long should pam_timestamp treat timestamp as valid after their + last modification date (in seconds). Default is 300 seconds. + + + + + + + + + + Attempt to inform the user when access is granted. + + + + + + + + + + Turns on debugging messages sent to + syslog3 + . + + + + + + + + MODULE TYPES PROVIDED + + The and + module types are provided. + + + + + RETURN VALUES + + + PAM_AUTH_ERR + + + The module was not able to retrive the user name or + no valid timestamp file was found. + + + + + PAM_SUCCESS + + + Everything was successfull. + + + + + PAM_SESSION_ERR + + + Timestamp file could not be created or updated. + + + + + + + + NOTES + + Users can get confused when they are not always asked for passwords when +running a given program. Some users reflexively begin typing information before +noticing that it is not being asked for. + + + + + EXAMPLES + +auth sufficient pam_timestamp.so verbose +auth required pam_unix.so + +session required pam_unix.so +session optional pam_timestamp.so + + + + + FILES + + + /var/run/sudo/... + + timestamp files and directories + + + + + + + SEE ALSO + + + pam_timestamp_check8 + , + + pam.conf5 + , + + pam.d5 + , + + pam8 + + + + + + AUTHOR + + pam_tally was written by Nalin Dahyabhai. + + + + + diff --git a/modules/pam_timestamp/pam_timestamp.c b/modules/pam_timestamp/pam_timestamp.c new file mode 100644 index 00000000..8a01c6f3 --- /dev/null +++ b/modules/pam_timestamp/pam_timestamp.c @@ -0,0 +1,816 @@ +/****************************************************************************** + * A module for Linux-PAM that will cache authentication results, inspired by + * (and implemented with an eye toward being mixable with) sudo. + * + * Copyright (c) 2002 Red Hat, Inc. + * Written by Nalin Dahyabhai + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#define PAM_SM_AUTH +#define PAM_SM_SESSION + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hmacsha1.h" + +#include +#include +#include +#include + +/* The default timeout we use is 5 minutes, which matches the sudo default + * for the timestamp_timeout parameter. */ +#define DEFAULT_TIMESTAMP_TIMEOUT (5 * 60) +#define MODULE "pam_timestamp" +#define TIMESTAMPDIR "/var/run/sudo" +#define TIMESTAMPKEY TIMESTAMPDIR "/_pam_timestamp_key" + +/* Various buffers we use need to be at least as large as either PATH_MAX or + * LINE_MAX, so choose the larger of the two. */ +#if (LINE_MAX > PATH_MAX) +#define BUFLEN LINE_MAX +#else +#define BUFLEN PATH_MAX +#endif + +/* Return PAM_SUCCESS if the given directory looks "safe". */ +static int +check_dir_perms(pam_handle_t *pamh, const char *tdir) +{ + char scratch[BUFLEN]; + struct stat st; + int i; + /* Check that the directory is "safe". */ + if ((tdir == NULL) || (strlen(tdir) == 0)) { + return PAM_AUTH_ERR; + } + /* Iterate over the path, checking intermediate directories. */ + memset(scratch, 0, sizeof(scratch)); + for (i = 0; (tdir[i] != '\0') && (i < (int)sizeof(scratch)); i++) { + scratch[i] = tdir[i]; + if ((scratch[i] == '/') || (tdir[i + 1] == '\0')) { + /* We now have the name of a directory in the path, so + * we need to check it. */ + if ((lstat(scratch, &st) == -1) && (errno != ENOENT)) { + pam_syslog(pamh, LOG_ERR, + "unable to read `%s': %m", + scratch); + return PAM_AUTH_ERR; + } + if (!S_ISDIR(st.st_mode)) { + pam_syslog(pamh, LOG_ERR, + "`%s' is not a directory", + scratch); + return PAM_AUTH_ERR; + } + if (S_ISLNK(st.st_mode)) { + pam_syslog(pamh, LOG_ERR, + "`%s' is a symbolic link", + scratch); + return PAM_AUTH_ERR; + } + if (st.st_uid != 0) { + pam_syslog(pamh, LOG_ERR, + "`%s' owner UID != 0", + scratch); + return PAM_AUTH_ERR; + } + if (st.st_gid != 0) { + pam_syslog(pamh, LOG_ERR, + "`%s' owner GID != 0", + scratch); + return PAM_AUTH_ERR; + } + if ((st.st_mode & (S_IWGRP | S_IWOTH)) != 0) { + pam_syslog(pamh, LOG_ERR, + "`%s' permissions are lax", + scratch); + return PAM_AUTH_ERR; + } + } + } + return PAM_SUCCESS; +} + +/* Validate a tty pathname as actually belonging to a tty, and return its base + * name if it's valid. */ +static const char * +check_tty(const char *tty) +{ + /* Check that we're not being set up to take a fall. */ + if ((tty == NULL) || (strlen(tty) == 0)) { + return NULL; + } + /* Pull out the meaningful part of the tty's name. */ + if (strchr(tty, '/') != NULL) { + if (strncmp(tty, "/dev/", 5) != 0) { + /* Make sure the device node is actually in /dev/, + * noted by Michal Zalewski. */ + return NULL; + } + tty = strrchr(tty, '/') + 1; + } + /* Make sure the tty wasn't actually a directory (no basename). */ + if (strlen(tty) == 0) { + return NULL; + } + return tty; +} + +/* Determine the right path name for a given user's timestamp. */ +static int +format_timestamp_name(char *path, size_t len, + const char *timestamp_dir, + const char *tty, + const char *ruser, + const char *user) +{ + if (strcmp(ruser, user) == 0) { + return snprintf(path, len, "%s/%s/%s", timestamp_dir, + ruser, tty); + } else { + return snprintf(path, len, "%s/%s/%s:%s", timestamp_dir, + ruser, tty, user); + } +} + +/* Check if a given timestamp date, when compared to a current time, fits + * within the given interval. */ +static int +timestamp_good(time_t then, time_t now, time_t interval) +{ + if (((now >= then) && ((now - then) < interval)) || + ((now < then) && ((then - now) < (2 * interval)))) { + return PAM_SUCCESS; + } + return PAM_AUTH_ERR; +} + +static int +check_login_time(const char *ruser, time_t timestamp) +{ + struct utmp utbuf, *ut; + time_t oldest_login = 0; + + setutent(); + while(!getutent_r(&utbuf, &ut)) { + if (ut->ut_type != USER_PROCESS) { + continue; + } + if (strncmp(ruser, ut->ut_user, sizeof(ut->ut_user) != 0)) { + continue; + } + if (oldest_login == 0 || oldest_login > ut->ut_tv.tv_sec) { + oldest_login = ut->ut_tv.tv_sec; + } + } + endutent(); + if(oldest_login == 0 || timestamp < oldest_login) { + return PAM_AUTH_ERR; + } + return PAM_SUCCESS; +} + +#ifndef PAM_TIMESTAMP_MAIN +static int +get_ruser(pam_handle_t *pamh, char *ruserbuf, size_t ruserbuflen) +{ + const void *ruser; + struct passwd *pwd; + + if (ruserbuf == NULL || ruserbuflen < 1) + return -2; + /* Get the name of the source user. */ + if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS) { + ruser = NULL; + } + if ((ruser == NULL) || (strlen(ruser) == 0)) { + /* Barring that, use the current RUID. */ + pwd = pam_modutil_getpwuid(pamh, getuid()); + if (pwd != NULL) { + ruser = pwd->pw_name; + } + } + if (ruser == NULL || strlen(ruser) >= ruserbuflen) { + *ruserbuf = '\0'; + return -1; + } + strcpy(ruserbuf, ruser); + return 0; +} + +/* Get the path to the timestamp to use. */ +static int +get_timestamp_name(pam_handle_t *pamh, int argc, const char **argv, + char *path, size_t len) +{ + const char *user, *tty; + const void *void_tty; + const char *tdir = TIMESTAMPDIR; + char ruser[BUFLEN]; + int i, debug = 0; + + /* Parse arguments. */ + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "debug") == 0) { + debug = 1; + } + } + for (i = 0; i < argc; i++) { + if (strncmp(argv[i], "timestampdir=", 13) == 0) { + tdir = argv[i] + 13; + if (debug) { + pam_syslog(pamh, LOG_DEBUG, + "storing timestamps in `%s'", + tdir); + } + } + } + i = check_dir_perms(pamh, tdir); + if (i != PAM_SUCCESS) { + return i; + } + /* Get the name of the target user. */ + if (pam_get_user(pamh, &user, NULL) != PAM_SUCCESS) { + user = NULL; + } + if ((user == NULL) || (strlen(user) == 0)) { + return PAM_AUTH_ERR; + } + if (debug) { + pam_syslog(pamh, LOG_DEBUG, "becoming user `%s'", user); + } + /* Get the name of the source user. */ + if (get_ruser(pamh, ruser, sizeof(ruser)) || strlen(ruser) == 0) { + return PAM_AUTH_ERR; + } + if (debug) { + pam_syslog(pamh, LOG_DEBUG, "currently user `%s'", ruser); + } + /* Get the name of the terminal. */ + if (pam_get_item(pamh, PAM_TTY, &void_tty) != PAM_SUCCESS) { + tty = NULL; + } else { + tty = void_tty; + } + if ((tty == NULL) || (strlen(tty) == 0)) { + tty = ttyname(STDIN_FILENO); + if ((tty == NULL) || (strlen(tty) == 0)) { + tty = ttyname(STDOUT_FILENO); + } + if ((tty == NULL) || (strlen(tty) == 0)) { + tty = ttyname(STDERR_FILENO); + } + if ((tty == NULL) || (strlen(tty) == 0)) { + /* Match sudo's behavior for this case. */ + tty = "unknown"; + } + } + if (debug) { + pam_syslog(pamh, LOG_DEBUG, "tty is `%s'", tty); + } + /* Snip off all but the last part of the tty name. */ + tty = check_tty(tty); + if (tty == NULL) { + return PAM_AUTH_ERR; + } + /* Generate the name of the file used to cache auth results. These + * paths should jive with sudo's per-tty naming scheme. */ + if (format_timestamp_name(path, len, tdir, tty, ruser, user) >= (int)len) { + return PAM_AUTH_ERR; + } + if (debug) { + pam_syslog(pamh, LOG_DEBUG, "using timestamp file `%s'", path); + } + return PAM_SUCCESS; +} + +/* Tell the user that access has been granted. */ +static void +verbose_success(pam_handle_t *pamh, long diff) +{ + pam_info(pamh, _("Access granted (last access was %ld seconds ago)."), diff); +} + +PAM_EXTERN int +pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) +{ + struct stat st; + time_t interval = DEFAULT_TIMESTAMP_TIMEOUT; + int i, fd, debug = 0, verbose = 0; + char path[BUFLEN], *p, *message, *message_end; + long tmp; + const void *void_service; + const char *service; + time_t now, then; + + /* Parse arguments. */ + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "debug") == 0) { + debug = 1; + } + } + for (i = 0; i < argc; i++) { + if (strncmp(argv[i], "timestamp_timeout=", 18) == 0) { + tmp = strtol(argv[i] + 18, &p, 0); + if ((p != NULL) && (*p == '\0')) { + interval = tmp; + if (debug) { + pam_syslog(pamh, LOG_DEBUG, + "setting timeout to %ld" + " seconds", (long)interval); + } + } + } else + if (strcmp(argv[i], "verbose") == 0) { + verbose = 1; + if (debug) { + pam_syslog(pamh, LOG_DEBUG, + "becoming more verbose"); + } + } + } + + if (flags & PAM_SILENT) { + verbose = 0; + } + + /* Get the name of the timestamp file. */ + if (get_timestamp_name(pamh, argc, argv, + path, sizeof(path)) != PAM_SUCCESS) { + return PAM_AUTH_ERR; + } + + /* Get the name of the service. */ + if (pam_get_item(pamh, PAM_SERVICE, &void_service) != PAM_SUCCESS) { + service = NULL; + } else { + service = void_service; + } + if ((service == NULL) || (strlen(service) == 0)) { + service = "(unknown)"; + } + + /* Open the timestamp file. */ + fd = open(path, O_RDONLY | O_NOFOLLOW); + if (fd == -1) { + if (debug) { + pam_syslog(pamh, LOG_DEBUG, + "cannot open timestamp `%s': %m", + path); + } + return PAM_AUTH_ERR; + } + + if (fstat(fd, &st) == 0) { + int count; + void *mac; + size_t maclen; + char ruser[BUFLEN]; + + /* Check that the file is owned by the superuser. */ + if ((st.st_uid != 0) || (st.st_gid != 0)) { + pam_syslog(pamh, LOG_ERR, "timestamp file `%s' is " + "not owned by root", path); + close(fd); + return PAM_AUTH_ERR; + } + + /* Check that the file is a normal file. */ + if (!(S_ISREG(st.st_mode))) { + pam_syslog(pamh, LOG_ERR, "timestamp file `%s' is " + "not a regular file", path); + close(fd); + return PAM_AUTH_ERR; + } + + /* Check that the file is the expected size. */ + if (st.st_size == 0) { + /* Invalid, but may have been created by sudo. */ + close(fd); + return PAM_AUTH_ERR; + } + if (st.st_size != + (off_t)(strlen(path) + 1 + sizeof(then) + hmac_sha1_size())) { + pam_syslog(pamh, LOG_NOTICE, "timestamp file `%s' " + "appears to be corrupted", path); + close(fd); + return PAM_AUTH_ERR; + } + + /* Read the file contents. */ + message = malloc(st.st_size); + count = 0; + if (!message) { + close(fd); + return PAM_BUF_ERR; + } + while (count < st.st_size) { + i = read(fd, message + count, st.st_size - count); + if ((i == 0) || (i == -1)) { + break; + } + count += i; + } + if (count < st.st_size) { + pam_syslog(pamh, LOG_NOTICE, "error reading timestamp " + "file `%s': %m", path); + close(fd); + free(message); + return PAM_AUTH_ERR; + } + message_end = message + strlen(path) + 1 + sizeof(then); + + /* Regenerate the MAC. */ + hmac_sha1_generate_file(pamh, &mac, &maclen, TIMESTAMPKEY, 0, 0, + message, message_end - message); + if ((mac == NULL) || + (memcmp(path, message, strlen(path)) != 0) || + (memcmp(mac, message_end, maclen) != 0)) { + pam_syslog(pamh, LOG_NOTICE, "timestamp file `%s' is " + "corrupted", path); + close(fd); + free(message); + return PAM_AUTH_ERR; + } + free(mac); + memmove(&then, message + strlen(path) + 1, sizeof(then)); + free(message); + + /* Check oldest login against timestamp */ + if (get_ruser(pamh, ruser, sizeof(ruser))) + { + close(fd); + return PAM_AUTH_ERR; + } + if (check_login_time(ruser, then) != PAM_SUCCESS) + { + pam_syslog(pamh, LOG_NOTICE, "timestamp file `%s' is " + "older than oldest login, disallowing " + "access to %s for user %s", + path, service, ruser); + close(fd); + return PAM_AUTH_ERR; + } + + /* Compare the dates. */ + now = time(NULL); + if (timestamp_good(then, now, interval) == PAM_SUCCESS) { + close(fd); + pam_syslog(pamh, LOG_NOTICE, "timestamp file `%s' is " + "only %ld seconds old, allowing access to %s " + "for user %s", path, (long) (now - st.st_mtime), + service, ruser); + if (verbose) { + verbose_success(pamh, now - st.st_mtime); + } + return PAM_SUCCESS; + } else { + close(fd); + pam_syslog(pamh, LOG_NOTICE, "timestamp file `%s' has " + "unacceptable age (%ld seconds), disallowing " + "access to %s for user %s", + path, (long) (now - st.st_mtime), + service, ruser); + return PAM_AUTH_ERR; + } + } + close(fd); + + /* Fail by default. */ + return PAM_AUTH_ERR; +} + +PAM_EXTERN int +pam_sm_setcred(pam_handle_t *pamh UNUSED, int flags UNUSED, int argc UNUSED, const char **argv UNUSED) +{ + return PAM_SUCCESS; +} + +PAM_EXTERN int +pam_sm_open_session(pam_handle_t *pamh, int flags UNUSED, int argc, const char **argv) +{ + char path[BUFLEN], subdir[BUFLEN], *text, *p; + void *mac; + size_t maclen; + time_t now; + int fd, i, debug = 0; + + /* Parse arguments. */ + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "debug") == 0) { + debug = 1; + } + } + + /* Get the name of the timestamp file. */ + if (get_timestamp_name(pamh, argc, argv, + path, sizeof(path)) != PAM_SUCCESS) { + return PAM_SESSION_ERR; + } + + /* Create the directory for the timestamp file if it doesn't already + * exist. */ + for (i = 1; path[i] != '\0'; i++) { + if (path[i] == '/') { + /* Attempt to create the directory. */ + strncpy(subdir, path, i); + subdir[i] = '\0'; + if (mkdir(subdir, 0700) == 0) { + /* Attempt to set the owner to the superuser. */ + lchown(subdir, 0, 0); + } else { + if (errno != EEXIST) { + if (debug) { + pam_syslog(pamh, LOG_DEBUG, + "error creating directory `%s': %m", + subdir); + } + return PAM_SESSION_ERR; + } + } + } + } + + /* Generate the message. */ + text = malloc(strlen(path) + 1 + sizeof(now) + hmac_sha1_size()); + if (text == NULL) { + pam_syslog(pamh, LOG_ERR, "unable to allocate memory: %m"); + return PAM_SESSION_ERR; + } + p = text; + + strcpy(text, path); + p += strlen(path) + 1; + + now = time(NULL); + memmove(p, &now, sizeof(now)); + p += sizeof(now); + + /* Generate the MAC and append it to the plaintext. */ + hmac_sha1_generate_file(pamh, &mac, &maclen, + TIMESTAMPKEY, + 0, 0, + text, p - text); + if (mac == NULL) { + pam_syslog(pamh, LOG_ERR, "failure generating MAC: %m"); + free(text); + return PAM_SESSION_ERR; + } + memmove(p, mac, maclen); + p += maclen; + free(mac); + + /* Open the file. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd == -1) { + pam_syslog(pamh, LOG_ERR, "unable to open `%s': %m", path); + free(text); + return PAM_SESSION_ERR; + } + + /* Attempt to set the owner to the superuser. */ + fchown(fd, 0, 0); + + /* Write the timestamp to the file. */ + if (write(fd, text, p - text) != p - text) { + pam_syslog(pamh, LOG_ERR, "unable to write to `%s': %m", path); + close(fd); + free(text); + return PAM_SESSION_ERR; + } + + /* Close the file and return successfully. */ + close(fd); + free(text); + pam_syslog(pamh, LOG_DEBUG, "updated timestamp file `%s'", path); + return PAM_SUCCESS; +} + +PAM_EXTERN int +pam_sm_close_session(pam_handle_t *pamh UNUSED, int flags UNUSED, int argc UNUSED, const char **argv UNUSED) +{ + return PAM_SUCCESS; +} + +#ifdef PAM_STATIC +/* static module data */ + +struct pam_module _pam_timestamp_modstruct = { + "pam_timestamp", + pam_sm_authenticate, + pam_sm_setcred, + NULL, + pam_sm_open_session, + pam_sm_close_session, + NULL +}; +#endif + + +#else /* PAM_TIMESTAMP_MAIN */ + +#define USAGE "Usage: %s [[-k] | [-d]] [target user]\n" +#define CHECK_INTERVAL 7 + +int +main(int argc, char **argv) +{ + int i, pretval = -1, retval = 0, dflag = 0, kflag = 0; + const char *target_user = NULL, *user = NULL, *tty = NULL; + struct passwd *pwd; + struct timeval tv; + fd_set write_fds; + char path[BUFLEN]; + struct stat st; + + /* Check that there's nothing funny going on with stdio. */ + if ((fstat(STDIN_FILENO, &st) == -1) || + (fstat(STDOUT_FILENO, &st) == -1) || + (fstat(STDERR_FILENO, &st) == -1)) { + /* Appropriate the "no controlling tty" error code. */ + return 3; + } + + /* Parse arguments. */ + while ((i = getopt(argc, argv, "dk")) != -1) { + switch (i) { + case 'd': + dflag++; + break; + case 'k': + kflag++; + break; + default: + fprintf(stderr, USAGE, argv[0]); + return 1; + break; + } + } + + /* Bail if both -k and -d are given together. */ + if ((kflag + dflag) > 1) { + fprintf(stderr, USAGE, argv[0]); + return 1; + } + + /* Check that we're setuid. */ + if (geteuid() != 0) { + fprintf(stderr, "%s must be setuid root\n", + argv[0]); + retval = 2; + } + + /* Check that we have a controlling tty. */ + tty = ttyname(STDIN_FILENO); + if ((tty == NULL) || (strlen(tty) == 0)) { + tty = ttyname(STDOUT_FILENO); + } + if ((tty == NULL) || (strlen(tty) == 0)) { + tty = ttyname(STDERR_FILENO); + } + if ((tty == NULL) || (strlen(tty) == 0)) { + tty = "unknown"; + } + + /* Get the name of the invoking (requesting) user. */ + pwd = getpwuid(getuid()); + if (pwd == NULL) { + retval = 4; + } + + /* Get the name of the target user. */ + user = strdup(pwd->pw_name); + if (user == NULL) { + retval = 4; + } else { + target_user = (optind < argc) ? argv[optind] : user; + if ((strchr(target_user, '.') != NULL) || + (strchr(target_user, '/') != NULL) || + (strchr(target_user, '%') != NULL)) { + fprintf(stderr, "unknown user: %s\n", + target_user); + retval = 4; + } + } + + /* Sanity check the tty to make sure we should be checking + * for timestamps which pertain to it. */ + if (retval == 0) { + tty = check_tty(tty); + if (tty == NULL) { + fprintf(stderr, "invalid tty\n"); + retval = 6; + } + } + + do { + /* Sanity check the timestamp directory itself. */ + if (retval == 0) { + if (check_dir_perms(NULL, TIMESTAMPDIR) != PAM_SUCCESS) { + retval = 5; + } + } + + if (retval == 0) { + /* Generate the name of the timestamp file. */ + format_timestamp_name(path, sizeof(path), TIMESTAMPDIR, + tty, user, target_user); + } + + if (retval == 0) { + if (kflag) { + /* Remove the timestamp. */ + if (lstat(path, &st) != -1) { + retval = unlink(path); + } + } else { + /* Check the timestamp. */ + if (lstat(path, &st) != -1) { + /* Check oldest login against timestamp */ + if (check_login_time(user, st.st_mtime) != PAM_SUCCESS) { + retval = 7; + } else if (!timestamp_good(st.st_mtime, time(NULL), + DEFAULT_TIMESTAMP_TIMEOUT) == PAM_SUCCESS) { + retval = 7; + } + } else { + retval = 7; + } + } + } + + if (dflag > 0) { + struct timeval now; + /* Send the would-be-returned value to our parent. */ + signal(SIGPIPE, SIG_DFL); + fprintf(stdout, "%d\n", retval); + fflush(stdout); + /* Wait. */ + gettimeofday(&now, NULL); + tv.tv_sec = CHECK_INTERVAL; + /* round the sleep time to get woken up on a whole second */ + tv.tv_usec = 1000000 - now.tv_usec; + if (now.tv_usec < 500000) + tv.tv_sec--; + FD_ZERO(&write_fds); + FD_SET(STDOUT_FILENO, &write_fds); + select(STDOUT_FILENO + 1, + NULL, NULL, &write_fds, + &tv); + pretval = retval; + retval = 0; + } + } while (dflag > 0); + + return retval; +} + +#endif diff --git a/modules/pam_timestamp/pam_timestamp_check.8.xml b/modules/pam_timestamp/pam_timestamp_check.8.xml new file mode 100644 index 00000000..85484a06 --- /dev/null +++ b/modules/pam_timestamp/pam_timestamp_check.8.xml @@ -0,0 +1,208 @@ + + + + + + + pam_timestamp_check + 8 + Linux-PAM Manual + + + + pam_timestamp_check + Check to see if the default timestamp is valid + + + + + pam_timestamp_check + + -k + + + -d + + + target_user + + + + + + + DESCRIPTION + + + With no arguments pam_timestamp_check will check to +see if the default timestamp is valid, or optionally remove it. + + + + + + OPTIONS + + + + + + + + Instead of checking the validity of a timestamp, remove it. + This is analogous to sudo's -k option. + + + + + + + + + + Instead of returning validity using an exit status, + loop indefinitely, polling regularly and printing the status on + standard output. + + + + + + + + + + By default pam_timestamp_check checks or removes + timestamps generated by pam_timestamp when + the user authenticates as herself. When the user authenticates as a + different user, the name of the timestamp file changes to + accomodate this. target_user allows + to specify this user name. + + + + + + + + RETURN VALUES + + + 0 + + + The timestamp is valid. + + + + + 2 + + + The binary is not setuid root. + + + + + 3 + + + Invalid invocation. + + + + + 4 + + + User is unknown. + + + + + 5 + + + Permissions error. + + + + + 6 + + + Invalid controlling tty. + + + + + 7 + + + Timestamp is not valid. + + + + + + + + NOTES + + Users can get confused when they are not always asked for passwords when +running a given program. Some users reflexively begin typing information before +noticing that it is not being asked for. + + + + + EXAMPLES + +auth sufficient pam_timestamp.so verbose +auth required pam_unix.so + +session required pam_unix.so +session optional pam_timestamp.so + + + + + FILES + + + /var/run/sudo/... + + timestamp files and directories + + + + + + + SEE ALSO + + + pam_timestamp_check8 + , + + pam.conf5 + , + + pam.d5 + , + + pam8 + + + + + + AUTHOR + + pam_tally was written by Nalin Dahyabhai. + + + + + diff --git a/modules/pam_timestamp/pam_timestamp_check.c b/modules/pam_timestamp/pam_timestamp_check.c new file mode 100644 index 00000000..52b5a95a --- /dev/null +++ b/modules/pam_timestamp/pam_timestamp_check.c @@ -0,0 +1,42 @@ +/****************************************************************************** + * A module for Linux-PAM that will cache authentication results, inspired by + * (and implemented with an eye toward being mixable with) sudo. + * + * Copyright (c) 2002 Red Hat, Inc. + * Written by Nalin Dahyabhai + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#define PAM_TIMESTAMP_MAIN 1 +#include "pam_timestamp.c" diff --git a/modules/pam_timestamp/sha1.c b/modules/pam_timestamp/sha1.c new file mode 100644 index 00000000..e6705eb5 --- /dev/null +++ b/modules/pam_timestamp/sha1.c @@ -0,0 +1,254 @@ +/* Yet another SHA-1 implementation. + * + * Copyright (c) 2003 Red Hat, Inc. + * Written by Nalin Dahyabhai + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/* See http://www.itl.nist.gov/fipspubs/fip180-1.htm for descriptions. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sha1.h" + +static unsigned char +padding[SHA1_BLOCK_SIZE] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static u_int32_t +F(u_int32_t b, u_int32_t c, u_int32_t d) +{ + return (b & c) | ((~b) & d); +} + +static u_int32_t +G(u_int32_t b, u_int32_t c, u_int32_t d) +{ + return b ^ c ^ d; +} + +static u_int32_t +H(u_int32_t b, u_int32_t c, u_int32_t d) +{ + return (b & c) | (b & d) | (c & d); +} + +static u_int32_t +RL(u_int32_t n, u_int32_t s) +{ + return (n << s) | (n >> (32 - s)); +} + +static u_int32_t +sha1_round(u_int32_t (*FUNC)(u_int32_t, u_int32_t, u_int32_t), + u_int32_t a, u_int32_t b, u_int32_t c, u_int32_t d, u_int32_t e, + u_int32_t i, u_int32_t n) +{ + return RL(a, 5) + FUNC(b, c, d) + e + i + n; +} + +void +sha1_init(struct sha1_context *ctx) +{ + memset(ctx, 0, sizeof(*ctx)); + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + ctx->e = 0xc3d2e1f0; +} + +static void +sha1_process(struct sha1_context *ctx, u_int32_t buffer[SHA1_BLOCK_SIZE / 4]) +{ + u_int32_t a, b, c, d, e, temp; + u_int32_t data[80]; + int i; + + for (i = 0; i < 16; i++) { + data[i] = htonl(buffer[i]); + } + for (i = 16; i < 80; i++) { + data[i] = RL(data[i - 3] ^ data[i - 8] ^ data[i - 14] ^ data[i - 16], 1); + } + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + e = ctx->e; + + for (i = 0; i < 20; i++) { + temp = sha1_round(F, a, b, c, d, e, data[i], 0x5a827999); + e = d; d = c; c = RL(b, 30); b = a; a = temp; + } + for (i = 20; i < 40; i++) { + temp = sha1_round(G, a, b, c, d, e, data[i], 0x6ed9eba1); + e = d; d = c; c = RL(b, 30); b = a; a = temp; + } + for (i = 40; i < 60; i++) { + temp = sha1_round(H, a, b, c, d, e, data[i], 0x8f1bbcdc); + e = d; d = c; c = RL(b, 30); b = a; a = temp; + } + for (i = 60; i < 80; i++) { + temp = sha1_round(G, a, b, c, d, e, data[i], 0xca62c1d6); + e = d; d = c; c = RL(b, 30); b = a; a = temp; + } + + ctx->a += a; + ctx->b += b; + ctx->c += c; + ctx->d += d; + ctx->e += e; + + memset(buffer, 0, sizeof(buffer[0]) * SHA1_BLOCK_SIZE / 4); + memset(data, 0, sizeof(data)); +} + +void +sha1_update(struct sha1_context *ctx, const unsigned char *data, size_t length) +{ + size_t i = 0, l = length, c, t; + u_int32_t count = 0; + + /* Process any pending + data blocks. */ + while (l + ctx->pending_count >= SHA1_BLOCK_SIZE) { + c = ctx->pending_count; + t = SHA1_BLOCK_SIZE - c; + memcpy(ctx->pending + c, &data[i], t); + sha1_process(ctx, (u_int32_t*) ctx->pending); + i += t; + l -= t; + ctx->pending_count = 0; + } + + /* Save what's left of the data block as a pending data block. */ + c = ctx->pending_count; + memcpy(ctx->pending + c, &data[i], l); + ctx->pending_count += l; + + /* Update the message length. */ + ctx->count += length; + + /* Update our internal counts. */ + if (length != 0) { + count = ctx->counts[0]; + ctx->counts[0] += length; + if (count >= ctx->counts[0]) { + ctx->counts[1]++; + } + } +} + +size_t +sha1_output(struct sha1_context *ctx, unsigned char *out) +{ + struct sha1_context ctx2; + + /* Output the sum. */ + if (out != NULL) { + u_int32_t c; + memcpy(&ctx2, ctx, sizeof(ctx2)); + + /* Pad this block. */ + c = ctx2.pending_count; + memcpy(ctx2.pending + c, + padding, SHA1_BLOCK_SIZE - c); + + /* Do we need to process two blocks now? */ + if (c >= (SHA1_BLOCK_SIZE - (sizeof(u_int32_t) * 2))) { + /* Process this block. */ + sha1_process(&ctx2, + (u_int32_t*) ctx2.pending); + /* Set up another block. */ + ctx2.pending_count = 0; + memset(ctx2.pending, 0, SHA1_BLOCK_SIZE); + ctx2.pending[0] = + (c == SHA1_BLOCK_SIZE) ? 0x80 : 0; + } + + /* Process the final block. */ + ctx2.counts[1] <<= 3; + if (ctx2.counts[0] >> 29) { + ctx2.counts[1] |= + (ctx2.counts[0] >> 29); + } + ctx2.counts[0] <<= 3; + ctx2.counts[0] = htonl(ctx2.counts[0]); + ctx2.counts[1] = htonl(ctx2.counts[1]); + memcpy(ctx2.pending + 56, + &ctx2.counts[1], sizeof(u_int32_t)); + memcpy(ctx2.pending + 60, + &ctx2.counts[0], sizeof(u_int32_t)); + sha1_process(&ctx2, (u_int32_t*) ctx2.pending); + + /* Output the data. */ + out[ 3] = (ctx2.a >> 0) & 0xff; + out[ 2] = (ctx2.a >> 8) & 0xff; + out[ 1] = (ctx2.a >> 16) & 0xff; + out[ 0] = (ctx2.a >> 24) & 0xff; + + out[ 7] = (ctx2.b >> 0) & 0xff; + out[ 6] = (ctx2.b >> 8) & 0xff; + out[ 5] = (ctx2.b >> 16) & 0xff; + out[ 4] = (ctx2.b >> 24) & 0xff; + + out[11] = (ctx2.c >> 0) & 0xff; + out[10] = (ctx2.c >> 8) & 0xff; + out[ 9] = (ctx2.c >> 16) & 0xff; + out[ 8] = (ctx2.c >> 24) & 0xff; + + out[15] = (ctx2.d >> 0) & 0xff; + out[14] = (ctx2.d >> 8) & 0xff; + out[13] = (ctx2.d >> 16) & 0xff; + out[12] = (ctx2.d >> 24) & 0xff; + + out[19] = (ctx2.e >> 0) & 0xff; + out[18] = (ctx2.e >> 8) & 0xff; + out[17] = (ctx2.e >> 16) & 0xff; + out[16] = (ctx2.e >> 24) & 0xff; + } + + return SHA1_OUTPUT_SIZE; +} diff --git a/modules/pam_timestamp/sha1.h b/modules/pam_timestamp/sha1.h new file mode 100644 index 00000000..667b87ca --- /dev/null +++ b/modules/pam_timestamp/sha1.h @@ -0,0 +1,60 @@ +/* Yet another SHA-1 implementation. + * + * Copyright (c) 2003 Red Hat, Inc. + * Written by Nalin Dahyabhai + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef pam_timestamp_sha1_h +#define pam_timestamp_sha1_h + +#include + +#define SHA1_BLOCK_SIZE 64 + +struct sha1_context { + size_t count; + unsigned char pending[SHA1_BLOCK_SIZE]; + u_int32_t counts[2]; + size_t pending_count; + u_int32_t a, b, c, d, e; +}; + +#define SHA1_OUTPUT_SIZE 20 + +void sha1_init(struct sha1_context *ctx); +void sha1_update(struct sha1_context *ctx, + const unsigned char *data, size_t length); +size_t sha1_output(struct sha1_context *ctx, unsigned char *out); + +#endif diff --git a/modules/pam_timestamp/tst-pam_timestamp b/modules/pam_timestamp/tst-pam_timestamp new file mode 100755 index 00000000..1d425b83 --- /dev/null +++ b/modules/pam_timestamp/tst-pam_timestamp @@ -0,0 +1,2 @@ +#!/bin/sh +../../tests/tst-dlopen .libs/pam_timestamp.so diff --git a/po/Linux-PAM.pot b/po/Linux-PAM.pot index 55b4ff46..054b95af 100644 --- a/po/Linux-PAM.pot +++ b/po/Linux-PAM.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "" @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "" @@ -353,13 +353,13 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "" @@ -424,20 +424,20 @@ msgstr "" msgid "login: failure forking: %m" msgstr "" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "" @@ -446,7 +446,7 @@ msgstr "" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -488,11 +488,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -506,6 +501,11 @@ msgid "" " [-r] [--reset[=n]] [--quiet]\n" msgstr "" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/POTFILES.in b/po/POTFILES.in index 5ca1caa9..a5db7a10 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -74,6 +74,8 @@ ./modules/pam_tally2/pam_tally2_app.c ./modules/pam_tally2/pam_tally2.c ./modules/pam_time/pam_time.c +./modules/pam_timestamp/pam_timestamp.c +./modules/pam_timestamp/pam_timestamp_check.c ./modules/pam_tty_audit/pam_tty_audit.c ./modules/pam_umask/pam_umask.c ./modules/pam_unix/bigcrypt.c diff --git a/po/ar.po b/po/ar.po index 68ecd939..77b6480f 100644 --- a/po/ar.po +++ b/po/ar.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2001-07-13 15:36+0200\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" @@ -166,19 +166,19 @@ msgid "Unknown PAM error" msgstr "خطأ PAM غير معروف" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "كلمة سر %s%s الجديدة: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "أعد كتابة كلمة سر %s%s الجديدة: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "عذرًا، يوجد عدم تطابق بين كلمات السر." @@ -229,7 +229,7 @@ msgid "Password unchanged" msgstr "لم يتم تغيير كلمة السر" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "كلمة سر سيئة: %s" @@ -352,14 +352,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "لم يتم تغيير كلمة السر" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "كلمة السر التي تم إدخالها مستخدمة بالفعل. اختر كلمة سر أخرى." @@ -428,20 +428,20 @@ msgstr "فشل pam_set_item()\n" msgid "login: failure forking: %m" msgstr "تسجيل الدخول: فشل تشعيب: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "تغيير كلمة سر STRESS لـ" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "أدخل كلمة سر STRESS الجديدة: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "أعد كتابة كلمة سر STRESS الجديدة: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "إعادة كتابة كلمة السر غير صحيحة؛ كلمة السر لم تتغير" @@ -450,7 +450,7 @@ msgstr "إعادة كتابة كلمة السر غير صحيحة؛ كلمة ا msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -493,11 +493,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: لا يمكن إعادة تعيين كافة المستخدمين إلى رقم غير الصفر\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -512,6 +507,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "انتهت مدة صلاحية الحساب الخاص بك؛ الرجاء الاتصال بمسؤول النظام" diff --git a/po/as.po b/po/as.po index 4810e74e..b705ad97 100644 --- a/po/as.po +++ b/po/as.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-13 11:23+0530\n" "Last-Translator: Amitakhya Phukan \n" "Language-Team: Assamese\n" @@ -168,19 +168,19 @@ msgid "Unknown PAM error" msgstr "অজ্ঞাত PAM ভুল" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "নতুন %s%s গুপ্তশব্দ: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "নতুন %s%s গুপ্তশব্দ পুনঃ লিখক: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "ক্ষমা কৰিব, গুপ্তশব্দৰ অমিল " @@ -231,7 +231,7 @@ msgid "Password unchanged" msgstr "গুপ্ত শব্দ অপৰিবৰ্ত্তিত" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "বেয়া গুপ্তশব্দ: %s" @@ -354,14 +354,14 @@ msgstr "'%s' পঞ্জিকা সৃষ্টি কৰা হৈছে । msgid "Unable to create directory %s: %m" msgstr "%s পঞ্জিকা সৃষ্টি কৰিব নোৱাৰি: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "গুপ্ত শব্দ অপৰিবৰ্ত্তিত" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "গুপ্তশব্দ ইতিমধ্যে ব্যৱহৃত । অন্য এটা বাচি লওক ।" @@ -426,20 +426,20 @@ msgstr "pam_set_item() কৰোঁতে বিফল\n" msgid "login: failure forking: %m" msgstr "প্ৰৱেশ: forking ত বিফল: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s ৰ বাবে STRESS গুপ্তশব্দ সলনি কৰা হৈছে ।" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "নতুন STRESS গুপ্তশব্দ দিয়ক:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "নতুন STRESS গুপ্তশব্দ পুনঃ লিখক: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "সত্যৰ প্ৰতিপাদন ভুলকৈ লিখা গ'ল;গুপ্তশব্দ অপৰিবৰ্ত্তিত" @@ -448,7 +448,7 @@ msgstr "সত্যৰ প্ৰতিপাদন ভুলকৈ লিখা msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -491,11 +491,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: সকলো ব্যৱহাৰকৰোঁতাক শূণ্য নোহোৱা অৱস্থালৈ পুনঃ প্ৰতিষ্ঠা কৰিব নোৱাৰি\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -510,6 +505,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "আপোনাৰ হিচাপ অন্ত হ'ল; অনুগ্ৰহ কৰি আপোনাৰ ব্যৱাস্থাপ্ৰণালীৰ " diff --git a/po/bn_IN.po b/po/bn_IN.po index b6c40529..0ddf5c46 100644 --- a/po/bn_IN.po +++ b/po/bn_IN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-20 12:40+0530\n" "Last-Translator: Runa Bhattacharjee \n" "Language-Team: Bengali INDIA \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "PAM সংক্রান্ত অজানা ত্রুটি" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "নতুন %s%s পাসওয়ার্ড: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "নতুন %s%s পাসওয়ার্ড পুনরায় লিখুন: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "দুঃখিত, পাসওয়ার্ড দুটি এক নয়।" @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "পাসওয়ার্ড পরিবর্তন করা হয়নি" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "পাসওয়ার্ড ভাল নয়: %s" @@ -353,13 +353,13 @@ msgstr "'%s' ডিরেক্টরি নির্মাণ করা হচ msgid "Unable to create directory %s: %m" msgstr "ডিরেক্টরি %s নির্মাণ করতে ব্যর্থ: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "পাসওয়ার্ড পরিবর্তনের কর্ম পরিত্যাগ করা হয়েছে।" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "পাসওয়ার্ড পূর্বে ব্যবহৃত হয়েছে। একটি পৃথক পাসওয়ার্ড নির্বাচন করুন।" @@ -424,20 +424,20 @@ msgstr "pam_set_item() করতে ব্যর্থ\n" msgid "login: failure forking: %m" msgstr "লগ-ইন: fork করতে ব্যর্থ: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s-র STRESS পাসওয়ার্ড পরিবর্তন করা হচ্ছে।" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "নতুন STRESS পাসওয়ার্ড লিখুন: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "নতুন STRESS পাসওয়ার্ড পুনরায় লিখুন: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "নিশ্চায়ন কাল ভুল টাইপ করা হয়েছে; পাসওয়ার্ড পরিবর্তন করা হয়নি" @@ -446,7 +446,7 @@ msgstr "নিশ্চায়ন কাল ভুল টাইপ করা হ msgid "Account temporary locked (%ld seconds left)" msgstr "সাময়িকরূপে অ্যাকাউন্ট লক করা হয়েছে (%ld সেকেন্ড অবশিষ্ট)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "%u ব্যর্থ লগ-ইনের ফলে অ্যাকাউন্ট লক করা হয়েছে" @@ -489,11 +489,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: সব ব্যবহারকারীর জন্য শূণ্য-ভিন্ন মান ধার্য করতে ব্যর্থ\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "%u ব্যর্থ লগ-ইনের ফলে অ্যাকাউন্ট লক করা হয়েছে" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -508,6 +503,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" @@ -564,6 +564,10 @@ msgstr "নতুন UNIX পাসওয়ার্ড উল্লেখ কর msgid "Retype new UNIX password: " msgstr "নতুন UNIX পাসওয়ার্ড পুনরায় লিখুন: " +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "%u ব্যর্থ লগ-ইনের ফলে অ্যাকাউন্ট লক করা হয়েছে" + #~ msgid "has been already used" #~ msgstr "পূর্বে ব্যবহৃত হয়েছে" diff --git a/po/ca.po b/po/ca.po index 69533a48..7ccb9b4b 100644 --- a/po/ca.po +++ b/po/ca.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-15 16:10+0200\n" "Last-Translator: Xavier Queralt Mateu \n" "Language-Team: Catalan \n" @@ -177,19 +177,19 @@ msgid "Unknown PAM error" msgstr "Error de PAM desconegut" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nova contrasenya de %s%s: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Torneu a escriure la nova contrasenya de %s%s: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Les contrasenyes no coincideixen." @@ -240,7 +240,7 @@ msgid "Password unchanged" msgstr "No s'ha canviat la contrasenya" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "CONTRASENYA INCORRECTA: %s" @@ -363,13 +363,13 @@ msgstr "Creant el directori '%s'." msgid "Unable to create directory %s: %m" msgstr "No s'ha pogut crear el directori %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "No s'ha canviat la contrasenya." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Aquesta contrasenya ja s'ha fet servir. Trieu-ne una altra." @@ -434,20 +434,20 @@ msgstr "s'ha produït un error en pam_set_item()\n" msgid "login: failure forking: %m" msgstr "entrada: ha fallat la bifurcació: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "S'està canviant la contrasenya d'STRESS per a %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Introduïu la nova contrasenya d'STRESS: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Torneu a escriure la nova contrasenya d'STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "" "Error d'escriptura durant la verificació; no s'ha canviat la contrasenya" @@ -457,7 +457,7 @@ msgstr "" msgid "Account temporary locked (%ld seconds left)" msgstr "Compte bloquejat temporalment (queden %ld segons)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -502,12 +502,6 @@ msgid "%s: Can't reset all users to non-zero\n" msgstr "" "%s: no es poden restablir tots els usuaris a un valor diferent de zero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" -"El compte ha estat bloquejat ja que s'ha intentat entrar %u cops sense èxit" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -522,6 +516,11 @@ msgid "" msgstr "" "%s: [--file nom_fitxer_arrel] [--user nom_usuari] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "El vostre compte ha caducat. Contacteu amb l'administrador del sistema" @@ -577,6 +576,12 @@ msgstr "Introduïu la nova contrasenya d'UNIX: " msgid "Retype new UNIX password: " msgstr "Torneu a escriure la nova contrasenya d'UNIX: " +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "" +#~ "El compte ha estat bloquejat ja que s'ha intentat entrar %u cops sense " +#~ "èxit" + #~ msgid "" #~ "There was %d failed login attempt since the last successful login.There " #~ "were %d failed login attempts since the last successful login." diff --git a/po/cs.po b/po/cs.po index 4273cbf2..7bfa4125 100644 --- a/po/cs.po +++ b/po/cs.po @@ -2,13 +2,13 @@ # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR Linux-PAM Project. # Klara Cihlarova , 2005, 2006. -# fixes by Tomas Mraz , 2005. +# Tomas Mraz , 2005, 2008. msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" -"PO-Revision-Date: 2008-10-13 21:54+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" +"PO-Revision-Date: 2008-11-28 15:22+0100\n" "Last-Translator: Tomas Mraz \n" "Language-Team: cs_CZ \n" "MIME-Version: 1.0\n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "Neznámá chyba PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nové %s%sheslo: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Opakujte nové %s%sheslo: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Hesla se neshodují." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "Heslo nebylo změněno" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ŠPATNÉ HESLO: %s" @@ -354,13 +354,13 @@ msgstr "Vytváření adresáře '%s'." msgid "Unable to create directory %s: %m" msgstr "Nezdařilo se vytvořit adresář %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Změna hesla přerušena." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Heslo již bylo použito. Zvolte jiné." @@ -425,20 +425,20 @@ msgstr "chyba pam_set_item()\n" msgid "login: failure forking: %m" msgstr "login: chyba forku: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Změna STRESS hesla pro %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Zadejte nové STRESS heslo: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Opakujte nové STRESS heslo: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Chybné potvrzení. Heslo nezměněno" @@ -447,7 +447,7 @@ msgstr "Chybné potvrzení. Heslo nezměněno" msgid "Account temporary locked (%ld seconds left)" msgstr "Účet dočasně uzamčen (zbývá %ld vteřin)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Účet uzamčen z důvodu %u neúspěšných pokusů o přihlášení" @@ -491,25 +491,26 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Nelze resetovat všechny uživatele nenulově\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Účet uzamčen z důvodu %u neúspěšných pokusů o přihlášení" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" -msgstr "" +msgstr "Login Selhání Poslední selhání Od\n" #: modules/pam_tally2/pam_tally2.c:881 -#, fuzzy, c-format +#, c-format msgid "" "%s: [-f rooted-filename] [--file rooted-filename]\n" " [-u username] [--user username]\n" " [-r] [--reset[=n]] [--quiet]\n" msgstr "" -"%s: [--file jmeno_souboru] [--user uzivatelske_jmeno] [--reset[=n]] [--" -"quiet]\n" +"%s: [-f plna-cesta-k-souboru] [--file plna-cesta-k-souboru]\n" +" [-u uzivatelske-jmeno] [--user uzivatelske-jmeno]\n" +" [-r] [--reset[=n]] [--quiet]\n" + +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "Přístup povolen (poslední přístup před %ld vteřinami)." #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" diff --git a/po/da.po b/po/da.po index 8abc754f..3abfe1da 100644 --- a/po/da.po +++ b/po/da.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2005-08-16 20:00+0200\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" @@ -171,19 +171,19 @@ msgid "Unknown PAM error" msgstr "Ukendt PAM-fejl" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Ny %s%sadgangskode: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Genindtast ny %s%sadgangskode: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Adgangskoderne stemmer desværre ikke overens." @@ -234,7 +234,7 @@ msgid "Password unchanged" msgstr "Adgangskoden er uændret" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "DÅRLIG ADGANGSKODE: %s" @@ -357,14 +357,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Adgangskoden er uændret" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Adgangskoden er allerede blevet brugt. Vælg en anden." @@ -435,20 +435,20 @@ msgstr "pam_set_item() mislykkedes\n" msgid "login: failure forking: %m" msgstr "login: fejl ved forking: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "Ændrer STRESS-adgangskode for" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Indtast ny STRESS-adgangskode: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Genindtast ny STRESS-adgangskode: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Bekræftelsen blev angivet forkert. Adgangskoden forbliver uændret" @@ -457,7 +457,7 @@ msgstr "Bekræftelsen blev angivet forkert. Adgangskoden forbliver uændret" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -500,11 +500,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Alle brugere kunne ikke nulstilles til ikke-nul\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -519,6 +514,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Din konto er udløbet. Kontakt din systemadministrator" diff --git a/po/de.po b/po/de.po index dae00135..fc18f978 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-27 07:45+0100\n" "Last-Translator: Fabian Affolter \n" "Language-Team: German \n" @@ -170,19 +170,19 @@ msgid "Unknown PAM error" msgstr "Unbekannter PAM-Fehler" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Geben Sie ein neues %s%sPasswort ein: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Geben Sie das neue %s%sPasswort erneut ein: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Die Passwörter stimmen nicht überein." @@ -233,7 +233,7 @@ msgid "Password unchanged" msgstr "Passwort nicht geändert" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "Schlechtes Passwort: %s" @@ -359,13 +359,13 @@ msgstr "Erstelle Verzeichnis '%s'." msgid "Unable to create directory %s: %m" msgstr "Verzeichnis %s kann nicht erstellt werden: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Passwort Änderung wurde abgebrochen." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Passwort wurde bereits verwendet. Wählen Sie ein anderes aus." @@ -430,20 +430,20 @@ msgstr "Fehler bei pam_set_item()\n" msgid "login: failure forking: %m" msgstr "Anmeldung: Fehler bei Abspaltung: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Ändern des STRESS-Passworts für %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Geben Sie ein neues STRESS-Passwort ein: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Geben Sie das neue STRESS-Passwort erneut ein: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Bestätigungspasswort falsch eingegeben; Passwort nicht geändert" @@ -452,7 +452,7 @@ msgstr "Bestätigungspasswort falsch eingegeben; Passwort nicht geändert" msgid "Account temporary locked (%ld seconds left)" msgstr "Account temporär gesperrt (noch %ld Sekunden)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Der Account ist wegen %u fehlgeschlagener Login-Versuche gesperrt" @@ -496,11 +496,6 @@ msgid "%s: Can't reset all users to non-zero\n" msgstr "" "%s: Es können nicht alle Benutzer auf Nicht-null zurückgesetzt werden\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Der Account ist wegen %hu fehlgeschlagener Login-Versuche gesperrt" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -517,6 +512,11 @@ msgstr "" " [-u username] [--user username]\n" " [-r] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Ihr Konto ist abgelaufen. Wenden Sie sich an den Systemadministrator" @@ -571,6 +571,9 @@ msgstr "Geben Sie ein neues UNIX-Passwort ein: " msgid "Retype new UNIX password: " msgstr "Geben Sie das neue UNIX-Passwort erneut ein: " +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Der Account ist wegen %hu fehlgeschlagener Login-Versuche gesperrt" + #~ msgid "has been already used" #~ msgstr "es wurde bereits verwendet" diff --git a/po/es.po b/po/es.po index c1151f95..2aeb0f1d 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip.es\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-02-21 00:03-0200\n" "Last-Translator: Domingo Becker \n" "Language-Team: Spanish \n" @@ -171,19 +171,19 @@ msgid "Unknown PAM error" msgstr "Error desconocido de PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nueva %s%scontraseña:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Vuelva a escribir la nueva %s%scontraseña:" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Las contraseñas no coinciden." @@ -234,7 +234,7 @@ msgid "Password unchanged" msgstr "La contraseña no ha cambiado" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "CONTRASEÑA INCORRECTA: %s" @@ -357,14 +357,14 @@ msgstr "Creando directorio '%s'." msgid "Unable to create directory %s: %m" msgstr "No se pudo crear el directorio %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "La contraseña no ha cambiado" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "La contraseña ya se ha utilizado. Seleccione otra." @@ -429,20 +429,20 @@ msgstr "error en pam_set_item()\n" msgid "login: failure forking: %m" msgstr "inicio de sesión: error en horquilla: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Cambiando la contraseña STRESS para %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Introduzca la nueva contraseña STRESS:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Vuelva a escribir la nueva contraseña STRESS:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Error al escribir la verificación; la contraseña no ha cambiado" @@ -451,7 +451,7 @@ msgstr "Error al escribir la verificación; la contraseña no ha cambiado" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -497,11 +497,6 @@ msgstr "" "%s: No es posible restaurar a todos los usuarios a un número distinto de " "cero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -517,6 +512,11 @@ msgstr "" "%s: [--file nombre de archivo-raíz] [--user nombre de usuario] [--reset[=n]] " "[--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/fi.po b/po/fi.po index bbb39bf7..7caf446a 100644 --- a/po/fi.po +++ b/po/fi.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2006-05-04 08:30+0200\n" "Last-Translator: Jyri Palokangas \n" "Language-Team: \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "Tuntematon PAM-virhe" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Uusi %s%ssalasana: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Anna uudelleen uusi %s%ssalasana: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Salasanat eivät täsmää." @@ -232,7 +232,7 @@ msgid "Password unchanged" msgstr "Salasanaa ei vaihdettu" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "HUONO SALASANA: %s" @@ -355,14 +355,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Salasanaa ei vaihdettu" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Salasana on jo käytetty. Valitse toinen." @@ -431,20 +431,20 @@ msgstr "pam_set_item() kutsu epäonnistui\n" msgid "login: failure forking: %m" msgstr "sisäänkirjautuminen: virhe haarautumisessa: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "Vaihdetaan STRESS-salasana " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Anna uusi STRESS-salasana: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Anna uusi STRESS-salasana uudelleen: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Salasanat eivät ole samat; salasanaa ei vaihdettu" @@ -453,7 +453,7 @@ msgstr "Salasanat eivät ole samat; salasanaa ei vaihdettu" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -497,11 +497,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Ei voida palauttaa kaikkia käyttäjiä ei-nolliksi\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -517,6 +512,11 @@ msgstr "" "%s: [--file juurrutettu-tiedostonimi] [--user käyttäjätunnus] [--reset[=n]] " "[--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Käyttäjätilisi on vanhentunut; ota yhteyttä järjestelmän ylläpitäjään" diff --git a/po/fr.po b/po/fr.po index d00af2dc..a53eef91 100644 --- a/po/fr.po +++ b/po/fr.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: pam.fr2\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-19 18:59+0200\n" "Last-Translator: Pablo Martin-Gomez \n" "Language-Team: Français \n" @@ -178,19 +178,19 @@ msgid "Unknown PAM error" msgstr "Erreur PAM inconnue" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nouveau %s%smot de passe : " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Retapez le nouveau %s%smot de passe : " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Les mots de passe ne correspondent pas." @@ -241,7 +241,7 @@ msgid "Password unchanged" msgstr "Mot de passe inchangé" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "MOT DE PASSE INCORRECT : %s" @@ -366,13 +366,13 @@ msgstr "Création du répertoire « %s »." msgid "Unable to create directory %s: %m" msgstr "Impossible de créer le répertoire %s : %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Changement du mot de passe avorté." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Mot de passe déjà utilisé. Choisissez-en un autre." @@ -437,20 +437,20 @@ msgstr "échec de pam_set_item()\n" msgid "login: failure forking: %m" msgstr "login : échec d'autoclônage : %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Changement du mot de passe STRESS pour %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Entrer le nouveau mot de passe STRESS : " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Retaper le nouveau mot de passe STRESS : " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Vérification erronée : mot de passe inchangé" @@ -459,7 +459,7 @@ msgstr "Vérification erronée : mot de passe inchangé" msgid "Account temporary locked (%ld seconds left)" msgstr "Compte temporairement verrouillé (%ld secondes restantes)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Compte temporairement verrouillé dû à l'échec de %u connexions" @@ -502,11 +502,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Impossible de réinitialiser tous les utilisateurs à non-zéro\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Compte temporairement verrouillé dû à l'échec de %u connexions" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -521,6 +516,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Votre compte a expiré. Contactez votre administrateur système" @@ -575,6 +575,10 @@ msgstr "Entrez le nouveau mot de passe UNIX : " msgid "Retype new UNIX password: " msgstr "Retapez le nouveau mot de passe UNIX : " +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Compte temporairement verrouillé dû à l'échec de %u connexions" + #~ msgid "has been already used" #~ msgstr "a déjà été utilisé" diff --git a/po/gu.po b/po/gu.po index 780f7648..737b4490 100644 --- a/po/gu.po +++ b/po/gu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip.gu\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-03-13 14:29+0530\n" "Last-Translator: Ankit Patel \n" "Language-Team: Gujarati \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "અજ્ઞાત PAM ભૂલ" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "નવો %s%sપાસવર્ડ: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "નવો %s%sપાસવર્ડ ફરી લખો: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "માફ કરજો, પાસવર્ડો બંધબેસતા નથી." @@ -232,7 +232,7 @@ msgid "Password unchanged" msgstr "પાસવર્ડ બદલાયેલ નથી" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ખરાબ પાસવર્ડ: %s" @@ -355,14 +355,14 @@ msgstr "ડિરેક્ટરી '%s' બનાવી રહ્યા છી msgid "Unable to create directory %s: %m" msgstr "ડિરેક્ટરી %s બનાવવામાં અસમર્થ: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "પાસવર્ડ બદલાયેલ નથી" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "પાસવર્ડ પહેલાથી જ વપરાઈ ગયેલ છે. બીજો પસંદ કરો." @@ -427,20 +427,20 @@ msgstr "pam_set_item() કરવામાં નિષ્ફળ\n" msgid "login: failure forking: %m" msgstr "પ્રવેશ: ફોર્કમાં નિષ્ફળ: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "STRESS પાસવર્ડ %s માટે બદલો." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "નવો STRESS પાસવર્ડ દાખલ કરો: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "નવો STRESS પાસવર્ડ પુનઃલખો: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "ચકાસણી ખોટી-રીતે લખાઈ; પાસવર્ડ બદલાયેલ નથી" @@ -449,7 +449,7 @@ msgstr "ચકાસણી ખોટી-રીતે લખાઈ; પાસવ msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -492,11 +492,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: બધા વપરાશકર્તાઓને બિન-શૂન્યમાં પુનઃસુયોજિત કરી શકતા નથી\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -511,6 +506,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "તમારું ખાતું નિવૃત્ત થઈ ગયું છે; મહેરબાની કરીને તમારા સિસ્ટમ સંચાલકનો સંપર્ક કરો" diff --git a/po/hi.po b/po/hi.po index 538fa17b..7edc79aa 100644 --- a/po/hi.po +++ b/po/hi.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: hi\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2007-06-21 15:22+0530\n" "Last-Translator: Rajesh Ranjan \n" "Language-Team: Hindi \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "अनजान PAM त्रुटि" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "नया %s%spassword: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "नया %s%spassword फिर टाइप करें: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "क्षमा करें, शब्दकूट नहीं मिलते हैं." @@ -232,7 +232,7 @@ msgid "Password unchanged" msgstr "शब्दकूट परिवर्तित" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "खराब शब्दकूट: %s" @@ -355,14 +355,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "शब्दकूट परिवर्तित" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "शब्दकूट को पहले ही बदला जा चुका है. दूसरा चुनें." @@ -431,20 +431,20 @@ msgstr "pam_set_item() में विफल\n" msgid "login: failure forking: %m" msgstr "लॉगिन: विफल फोर्किंग: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "इसके लिए स्ट्रेस शब्दकूट बदल रहा है " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "नया स्ट्रेस शब्दकूट दें: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "नया शब्दकूट फिर टाइप करें: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "जांच गलत टाइप किया गया; शब्दकूट बदला गया" @@ -453,7 +453,7 @@ msgstr "जांच गलत टाइप किया गया; शब्द msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -496,11 +496,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: सभी उपयोक्ता को गैर शून्य में फिर सेट नहीं कर सकता है\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -515,6 +510,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "आपका खाता समाप्त हो चुका है; कृपया अपने सिस्टम प्रशासक को संपर्क करें" diff --git a/po/hu.po b/po/hu.po index 05f90755..8a1a39ab 100644 --- a/po/hu.po +++ b/po/hu.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: pam\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-04-30 08:23+0100\n" "Last-Translator: Sulyok Péter \n" "Language-Team: Hungarian \n" @@ -176,19 +176,19 @@ msgid "Unknown PAM error" msgstr "Ismeretlen PAM hiba" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Új %s%sjelszó: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Ismét az új %s%sjelszó: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Sajnálom, de a jelszavak nem egyeznek." @@ -239,7 +239,7 @@ msgid "Password unchanged" msgstr "Változatlan jelszó" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ROSSZ JELSZÓ: %s" @@ -362,14 +362,14 @@ msgstr "\"%s\" mappa teremtése" msgid "Unable to create directory %s: %m" msgstr "%s mapa nem teremthető meg: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Változatlan jelszó" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "A jelszót már használta. Válasszon másikat!" @@ -434,20 +434,20 @@ msgstr "pam_set_item() meghiúsult\n" msgid "login: failure forking: %m" msgstr "bejelentkezés: elágazás hiba: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s STRESS jelszavának megváltoztatása." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Új STRESS jelszó: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Ismét az új STRESS jelszó: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Az ellenőrző jelszó nem egyezik; a jelszó nem került módosításra" @@ -456,7 +456,7 @@ msgstr "Az ellenőrző jelszó nem egyezik; a jelszó nem került módosításra msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -499,11 +499,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Nem állítható vissza minden használó nem nullára\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -518,6 +513,11 @@ msgid "" msgstr "" "%s: [--file rooted-fájlnév] [--user használó] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "A számla érvényessége lejárt; kérem keresse meg a rendszergazdát" diff --git a/po/it.po b/po/it.po index b55ec5a7..ba5e05ed 100644 --- a/po/it.po +++ b/po/it.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-21 13:21+1000\n" "Last-Translator: \n" "Language-Team: \n" @@ -173,19 +173,19 @@ msgid "Unknown PAM error" msgstr "Errore PAM sconosciuto" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nuova password%s%s: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Reimmettere la nuova password%s%s: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Le password non corrispondono." @@ -236,7 +236,7 @@ msgid "Password unchanged" msgstr "Password non modificata" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "PASSWORD ERRATA: %s" @@ -365,13 +365,13 @@ msgstr "Creazione della directory \"%s\"." msgid "Unable to create directory %s: %m" msgstr "Impossibile creare la directory %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Cambio della password abortito." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Password già utilizzata. Sceglierne un'altra." @@ -436,20 +436,20 @@ msgstr "Impossibile eseguire pam_set_item()\n" msgid "login: failure forking: %m" msgstr "login: forking fallito: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Cambio password STRESS per %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Immettere nuova password STRESS: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Reimmettere la nuova password STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Errore di digitazione per verifica; password non cambiata" @@ -458,7 +458,7 @@ msgstr "Errore di digitazione per verifica; password non cambiata" msgid "Account temporary locked (%ld seconds left)" msgstr "Account momentaneamente bloccato (%ld secondi rimanenti)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Account bloccato a causa di %u login falliti" @@ -501,11 +501,6 @@ msgid "%s: Can't reset all users to non-zero\n" msgstr "" "%s: Impossibile ripristinare tutti gli utenti a valori diversi da zero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Account bloccato a causa di %u login falliti" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -519,6 +514,11 @@ msgid "" " [-r] [--reset[=n]] [--quiet]\n" msgstr "%s: [--file NOMEFILE] [--user NOMEUTENTE] [--reset[=N]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Account scaduto; contattare l'amministratore di sistema" @@ -575,3 +575,7 @@ msgstr "Immettere nuova password UNIX: " #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "Reimmettere la nuova password UNIX: " + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Account bloccato a causa di %u login falliti" diff --git a/po/ja.po b/po/ja.po index 18a43028..22618542 100644 --- a/po/ja.po +++ b/po/ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip.ja\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-21 15:08+1000\n" "Last-Translator: Kiyoto Hashida \n" "Language-Team: Japanese \n" @@ -168,19 +168,19 @@ msgid "Unknown PAM error" msgstr "不明なPAMエラー" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "新しい%s%sパスワード:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "新しい%s%sパスワードを再入力してください:" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "パスワードが一致しません。" @@ -231,7 +231,7 @@ msgid "Password unchanged" msgstr "パスワードが変更されていません" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "よくないパスワード: %s" @@ -353,13 +353,13 @@ msgstr "ディレクトリ '%s' を作成中" msgid "Unable to create directory %s: %m" msgstr "ディレクトリ %s を作成できません: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "パスワードの変更は放棄されました" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "" @@ -425,20 +425,20 @@ msgstr "pam_set_item()に失敗しました\n" msgid "login: failure forking: %m" msgstr "ログイン: いまいましい失敗: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s 用の STRESS パスワードを変更中" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "新しいSTRESSパスワードを入力してください:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "新しいSTRESSパスワードを再入力してください:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "ミスタイプの確認、パスワードが変更されていません" @@ -447,7 +447,7 @@ msgstr "ミスタイプの確認、パスワードが変更されていません msgid "Account temporary locked (%ld seconds left)" msgstr "アカウントは一時的にロックされています (残り %ld 秒)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "%u のログイン失敗の理由で アカウントはロックされました" @@ -490,11 +490,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: すべてのユーザを非ゼロにリセットできません\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "%u のログイン失敗の理由で アカウントはロックされました" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -509,6 +504,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" @@ -562,3 +562,7 @@ msgstr "新しいUNIXパスワードを入力してください:" #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "新しいUNIX パスワードを再入力してください:" + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "%u のログイン失敗の理由で アカウントはロックされました" diff --git a/po/km.po b/po/km.po index 4f7ab9f6..c642235b 100644 --- a/po/km.po +++ b/po/km.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2006-03-17 10:32+0700\n" "Last-Translator: Khoem Sokhem \n" "Language-Team: Khmer \n" @@ -170,19 +170,19 @@ msgid "Unknown PAM error" msgstr "មិន​ស្គាល់​កំហុស PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "ពាក្យ​សម្ងាត់ %s%s ថ្មី ៖" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "វាយ​ពាក្យ​សម្ងាត់ %s%s ថ្មី​ឡើង​វិញ ៖" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "សូម​ទោស ពាក្យ​សម្ងាត់​មិន​ដូច​គ្នា​ឡើយ ។" @@ -233,7 +233,7 @@ msgid "Password unchanged" msgstr "ពាក្យសម្ងាត់​មិន​បាន​ផ្លាស់ប្ដូរ​ឡើយ" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ពាក្យ​សម្ងាត់​មិន​ល្អ ៖ %s" @@ -356,14 +356,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "ពាក្យសម្ងាត់​មិន​បាន​ផ្លាស់ប្ដូរ​ឡើយ" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "ពាក្យសម្ងាត់​ត្រូវ​បាន​ប្រើ​រួច​ហើយ ។ សូម​ជ្រើស​មួយ​ទៀត ។" @@ -432,20 +432,20 @@ msgstr "បាន​បរាជ័យ pam_set_item()\n" msgid "login: failure forking: %m" msgstr "ចូល ៖ ចម្លង​ខ្លួន​ឯង​មិន​បាន​ជោគជ័យ ៖ %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "ការ​ផ្លាស់ប្ដូរ​ពាក្យ​សម្ងាត់ STRESS សម្រាប់ " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "បញ្ចូល​ពាក្យ​សម្ងាត់ STRESS ថ្មី ៖ " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "វាយ​ពាក្យ​សម្ងាត់ STRESS ថ្មី​ម្ដង​ទៀត ៖ " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "ផ្ទៀងផ្ទាត់​អក្ខរាវិរុទ្ធ​ដែល​បាន​វាយខុស ពាក្យ​សម្ងាត់​មិន​បានផ្លាស់ប្ដូរ​" @@ -454,7 +454,7 @@ msgstr "ផ្ទៀងផ្ទាត់​អក្ខរាវិរុទ្ msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -497,11 +497,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s ៖ មិន​អាច​កំណត់​អ្នក​ប្រើ​ទាំងអស់​ទៅ​មិនមែន​សូន្យ​ឡើងវិញ​បានទេ\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -516,6 +511,11 @@ msgid "" msgstr "" "%s ៖ [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "គណនី​របស់​អ្នក​បាន​ផុតកំណត់​ហើយ សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​ប្រព័ន្ធ​របស់​អ្នក" diff --git a/po/kn.po b/po/kn.po index 5ce43d17..2b499202 100644 --- a/po/kn.po +++ b/po/kn.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip.kn\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-20 12:29+0530\n" "Last-Translator: Shankar Prasad \n" "Language-Team: Kannada \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "ಗೊತ್ತಿರದ PAM ದೋಷ" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "ಹೊಸ %s%sಗುಪ್ತಪದ: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "ಹೊಸ %s%sಗುಪ್ತಪದವನ್ನು ಪುನರ್ ಟೈಪಿಸಿ: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "ಕ್ಷಮಿಸಿ, ಗುಪ್ತಪದಗಳು ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "ಗುಪ್ತಪದ ಬದಲಾಗಿಲ್ಲ" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ಕೆಟ್ಟ ಗುಪ್ತಪದ: %s" @@ -353,13 +353,13 @@ msgstr "ಕೋಶ '%s' ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದ msgid "Unable to create directory %s: %m" msgstr "ಕೋಶ '%s' ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "ಗುಪ್ತಪದ ಬದಲಾವಣೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲಾಗಿದೆ." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "ಗುಪ್ತಪದವು ಈಗಾಗಲೆ ಬಳಸಲ್ಪಟ್ಟಿದೆ. ಬೇರೊಂದನ್ನು ಬಳಸಿ." @@ -424,20 +424,20 @@ msgstr "pam_set_item() ಮಾಡುವಲ್ಲಿ ವಿಫಲತೆ\n" msgid "login: failure forking: %m" msgstr "ಲಾಗಿನ್: ಫೋರ್ಕಿಂಗ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲತೆ:%m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s ಗಾಗಿ STRESS ಗುಪ್ತಪದವನ್ನು ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "ಹೊಸ STRESS ಗುಪ್ತಪದವನ್ನು ಟೈಪಿಸಿ: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "ಹೊಸ STRESS ಗುಪ್ತಪದವನ್ನು ಪುನಃ ಟೈಪಿಸಿ: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "ತಪಾಸಣೆಗೆ ಟೈಪಿಸಿದ್ದು ತಪ್ಪಾಗಿದೆ; ಗುಪ್ತಪದ ಬದಲಾಗಿಲ್ಲ" @@ -446,7 +446,7 @@ msgstr "ತಪಾಸಣೆಗೆ ಟೈಪಿಸಿದ್ದು ತಪ್ಪಾ msgid "Account temporary locked (%ld seconds left)" msgstr "ಖಾತೆಯನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ (%ld ಸೆಕೆಂಡುಗಳು ಉಳಿದಿವೆ)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "ವಿಫಲಗೊಂಡ %u ಪ್ರವೇಶಗಳಿಂದಾಗಿ ಖಾತೆಯನ್ನು ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ" @@ -489,11 +489,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ಶೂನ್ಯವಲ್ಲದುದಕ್ಕೆ ಪುನರ್ ಸಂಯೋಜಿಸಲು ಆಗುವುದಿಲ್ಲ\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "ವಿಫಲಗೊಂಡ %u ಪ್ರವೇಶಗಳಿಂದಾಗಿ ಖಾತೆಯನ್ನು ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -508,6 +503,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "ನಿಮ್ಮ ಖಾತೆಯ ಅವಧಿ ಅಂತ್ಯಗೊಂಡಿದೆ; ದಯವಿಟ್ಟು ನಿಮ್ಮ ಗಣಕ ವ್ಯವಸ್ಥಾಪಕರನ್ನು ಸಂಪರ್ಕಿಸಿ" @@ -562,3 +562,7 @@ msgstr "ಹೊಸ UNIX ಗುಪ್ತಪದವನ್ನು ದಾಖಲಿಸ #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "ಹೊಸ UNIX ಗುಪ್ತಪದವನ್ನು ಪುನಃ ಟೈಪಿಸಿ: " + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "ವಿಫಲಗೊಂಡ %u ಪ್ರವೇಶಗಳಿಂದಾಗಿ ಖಾತೆಯನ್ನು ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ" diff --git a/po/ko.po b/po/ko.po index d5f158e2..45ea5090 100644 --- a/po/ko.po +++ b/po/ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ko\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2007-06-22 10:02+1000\n" "Last-Translator: Eunju Kim \n" "Language-Team: Korean \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "알 수 없는 PAM 오류" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "새 %s%s 암호:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "새 %s%s 암호 재입력:" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "죄송합니다. 암호가 일치하지 않습니다." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "암호가 변경되지 않음" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "잘못된 암호: %s" @@ -352,14 +352,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "암호가 변경되지 않음" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "이미 사용되고 있는 암호입니다. 다른 암호를 선택해 주십시오." @@ -428,20 +428,20 @@ msgstr "pam_set_item() 실패\n" msgid "login: failure forking: %m" msgstr "로그인: 포크 작업(forking) 실패: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "STRESS 암호 변경" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "새 STRESS 암호 입력:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "새 STRESS 암호를 재입력:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "암호 확인에서 잘못 입력됨; 암호가 변경되지 않음" @@ -450,7 +450,7 @@ msgstr "암호 확인에서 잘못 입력됨; 암호가 변경되지 않음" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -493,11 +493,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: 모든 사용자를 영이 아닌 값으로 설정할 수 없음\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -512,6 +507,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "계정이 만료되었습니다: 시스템 관리자에게 알려 주십시오" diff --git a/po/ml.po b/po/ml.po index f0daba80..2370671d 100644 --- a/po/ml.po +++ b/po/ml.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip.ml\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-20 12:50+0530\n" "Last-Translator: \n" "Language-Team: \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "അപരിചിതമായ PAM പിശക്" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "പുതിയ %s%s പാസ്‌വേറ്‍ഡ്: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "വീണ്ടും %s%s പാസ്‌വേറ്‍ഡ് ടൈപ്പ് ചെയ്യുക: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "ക്ഷമിക്കണം, പാസ്‌വേറ്‍ഡുകള്‍ തമ്മില്‍ ചേരുന്നില്ല." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "പാസ്‌വേറ്‍ഡ് മാറ്റിയിട്ടില്ല" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "BAD PASSWORD: %s" @@ -353,13 +353,13 @@ msgstr "'%s' ഡയറക്ടറി ഉണ്ടാക്കുന്നു." msgid "Unable to create directory %s: %m" msgstr "%s ഡയറക്ടറി ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "അടയാളവാക്ക് മാറ്റം വരുത്തുന്നതു് നിര്‍ത്തിയിരിക്കുന്നു." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "പാസ്‌വേറ്‍ഡ് നിലവില്‍ ഉപയോഗിത്തിലുള്ളതാണ്. മറ്റൊന്ന് നല്‍കുക." @@ -424,20 +424,20 @@ msgstr "pam_set_item() ചെയ്യുന്നതില്‍ പരാജ msgid "login: failure forking: %m" msgstr "login: ഫോറ്‍ക്ക് ചെയ്യുന്നതില്‍ പരാജയം: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s-നുളള STRESS അടയാളവാക്ക് മാറ്റുന്നു." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "പുതിയ STRESS പാസ്‌വേറ്‍ഡ് നല്‍കുക: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "പുതിയ STRESS പാസ്‌വേറ്‍ഡ് വീണ്ടും ടൈപ്പ് ചെയ്യുക: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "പാസ്‌വേറ്‍ഡ് ഉറപ്പാക്കുന്നതിനായി ടൈപ്പ് ചെയ്തത് തെറ്റാണ്; പാസ്‌വേറ്‍ഡ് മാറ്റിയിട്ടില്ല" @@ -446,7 +446,7 @@ msgstr "പാസ്‌വേറ്‍ഡ് ഉറപ്പാക്കുന msgid "Account temporary locked (%ld seconds left)" msgstr "അക്കൌണ്ട് താല്‍ക്കാലികമായി പൂട്ടിയിരിക്കുന്നു (%ld നിമിഷങ്ങള്‍ ബാക്കി)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "%u പരാജയപ്പെട്ട ലോഗിനുകള്‍ കാരണം അക്കൌണ്ട് താല്‍ക്കാലികമായി പൂട്ടിയിരിക്കുന്നു" @@ -489,11 +489,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: എല്ലാ യൂസറുകളും പൂജ്യം അല്ലാതെ ക്റമികരിക്കുവാന്‍ സാധ്യമല്ല\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "%u പരാജയപ്പെട്ട ലോഗിനുകള്‍ കാരണം അക്കൌണ്ട് താല്‍ക്കാലികമായി പൂട്ടിയിരിക്കുന്നു" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -508,6 +503,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" @@ -563,3 +563,7 @@ msgstr "പുതിയ UNIX പാസ്‌വേറ്‍ഡ് നല്‍ #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "പുതിയ UNIX പാസ്‌വേറ്‍ഡ് വീണ്ടും ടൈപ്പ് ചെയ്യുക: " + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "%u പരാജയപ്പെട്ട ലോഗിനുകള്‍ കാരണം അക്കൌണ്ട് താല്‍ക്കാലികമായി പൂട്ടിയിരിക്കുന്നു" diff --git a/po/mr.po b/po/mr.po index 1299782c..5b716436 100644 --- a/po/mr.po +++ b/po/mr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-10 07:07+0530\n" "Last-Translator: Sandeep Shedmake \n" "Language-Team: marathi\n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "अपरिचीत PAM त्रुटी" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "नविन गुप्तशब्द %s%sp: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "नविन गुप्तशब्द %s%sp पुन्हा टाइप करा: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "माफ करा, गुप्तशब्द जुळत नाही." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "गुप्तशब्द बदलविला नाही" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "अयोग्य गुप्तशब्द: %s" @@ -353,14 +353,14 @@ msgstr "संचयीका '%s' बनवित आहे." msgid "Unable to create directory %s: %m" msgstr "संचयीका %s बनवू शकत नाही: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "गुप्तशब्द बदलविला नाही" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "ह्या गुप्तशब्दचा आधीच वापर झाला आहे. दुसरा निवडा." @@ -425,20 +425,20 @@ msgstr "pam_set_item() कार्यान्वीत करण्यास msgid "login: failure forking: %m" msgstr "दाखलन: विभाजन अपयशी: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s करीता STRESS गुप्तशब्द बदलवित आहे." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "नविन STRESS गुप्तशब्द प्रविष्ट करा: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "नविन STRESS गुप्तशब्द पुन्हा प्रविष्ट करा: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "तपासणी पूर्ण झाली नाही; गुप्तशब्द बदलविले नाही" @@ -447,7 +447,7 @@ msgstr "तपासणी पूर्ण झाली नाही; गुप msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -490,11 +490,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: सर्व वापरकर्ता विना-शून्य असे पुन्हस्थापन करू शकत नाही\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -509,6 +504,11 @@ msgid "" msgstr "" "%s: [--file रूटेड-फाइलनाव] [--user वापरकर्त्याचे नाव] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "तुमचे खाते बंद झाले आहे, कृपया तुमच्या संगणक व्यवस्थापकाकडे जा" diff --git a/po/ms.po b/po/ms.po index e5df671a..300697c4 100644 --- a/po/ms.po +++ b/po/ms.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: linux-pam\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-09-25 23:52+0800\n" "Last-Translator: Sharuzzaman Ahmat Raslan \n" "Language-Team: Malay \n" @@ -182,19 +182,19 @@ msgid "Unknown PAM error" msgstr "Ralat sistem tidak diketahui" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, fuzzy, c-format msgid "New %s%spassword: " msgstr "&Tetingkap Baru" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, fuzzy, c-format msgid "Retype new %s%spassword: " msgstr "Baru me&nggunakan Template" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 #, fuzzy msgid "Sorry, passwords do not match." msgstr "Sijil dan kekunci diberi tidak sepadan." @@ -254,7 +254,7 @@ msgid "Password unchanged" msgstr "Biarkan tanpa diubah" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, fuzzy, c-format msgid "BAD PASSWORD: %s" msgstr "Katalaluan Tidak Betul" @@ -382,14 +382,14 @@ msgstr "Menbuat direktori initrd" msgid "Unable to create directory %s: %m" msgstr "gagal untuk mencipta direktori %s: %s\n" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Biarkan tanpa diubah" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "" @@ -458,21 +458,21 @@ msgstr "" msgid "login: failure forking: %m" msgstr "Ben_arkan logmasuk luartalian" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "Greek 'astator' untuk 'menukar'" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 #, fuzzy msgid "Enter new STRESS password: " msgstr "Masukkkan Katalaluan Pemuat But" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "" @@ -481,7 +481,7 @@ msgstr "" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -527,11 +527,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -545,6 +540,11 @@ msgid "" " [-r] [--reset[=n]] [--quiet]\n" msgstr "" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/nb.po b/po/nb.po index 06f041b3..cddf89ff 100644 --- a/po/nb.po +++ b/po/nb.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-04-30 12:59+0200\n" "Last-Translator: Olav Pettershagen \n" "Language-Team: \n" @@ -166,19 +166,19 @@ msgid "Unknown PAM error" msgstr "Ukjent PAM-feil" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nytt %s%spassord: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Bekreft nytt %s%s-passord: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Beklager, ikke samsvar mellom passord." @@ -229,7 +229,7 @@ msgid "Password unchanged" msgstr "Passord uendret" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "SVAKT PASSORD: %s" @@ -352,14 +352,14 @@ msgstr "Oppretter katalog «%s»." msgid "Unable to create directory %s: %m" msgstr "Kan ikke opprette katalog %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Passord uendret" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Passordet er allerede benyttet. Velg et annet." @@ -424,20 +424,20 @@ msgstr "kunne ikke pam_set_item()\n" msgid "login: failure forking: %m" msgstr "login: feil under forgrening: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Endrer STRESS-passord for %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Angi nytt STRESS-passord: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Bekreft nytt STRESS-passord: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Bekreftelse feil skrevet; passord uendret" @@ -446,7 +446,7 @@ msgstr "Bekreftelse feil skrevet; passord uendret" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -489,11 +489,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Kan ikke tilbakestille alle brukere til non-zero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -508,6 +503,11 @@ msgid "" msgstr "" "%s: [--file rooted-filnavn] [--user brukernavn] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Din konto er utløpt; kontakt systemadministratoren" diff --git a/po/nl.po b/po/nl.po index c04ee38a..1a3e71c7 100644 --- a/po/nl.po +++ b/po/nl.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-20 23:45+0200\n" "Last-Translator: Peter van Egdom \n" "Language-Team: Dutch \n" @@ -168,19 +168,19 @@ msgid "Unknown PAM error" msgstr "Onbekende PAM-fout" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nieuw %s%swachtwoord: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Nieuw %s%swachtwoord herhalen: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Sorry, wachtwoorden komen niet overeen." @@ -231,7 +231,7 @@ msgid "Password unchanged" msgstr "Wachtwoord is niet gewijzigd" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "SLECHT WACHTWOORD: %s" @@ -359,13 +359,13 @@ msgstr "Aanmaken van map '%s'." msgid "Unable to create directory %s: %m" msgstr "Niet in staat om map %s aan te maken: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Wachtwoord wijzigen afgebroken." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Wachtwoord is al gebruikt. Kies een ander wachtwoord." @@ -430,20 +430,20 @@ msgstr "pam_set_item() is mislukt\n" msgid "login: failure forking: %m" msgstr "login: beginnen van nieuw proces mislukt: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Veranderen van STRESS-wachtwoord voor %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Nieuw STRESS-wachtwoord invoeren: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Nieuw STRESS-wachtwoord herhalen: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Verificatie onjuist getypt; wachtwoord blijft ongewijzigd" @@ -452,7 +452,7 @@ msgstr "Verificatie onjuist getypt; wachtwoord blijft ongewijzigd" msgid "Account temporary locked (%ld seconds left)" msgstr "Account tijdelijk vergrendeld (%ld seconden resterend)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Account vergrendeld wegens %u mislukte aanmeldingen" @@ -496,11 +496,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: kan niet alle gebruikers terugzetten naar non-zero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Account vergrendeld wegens %u mislukte aanmeldingen" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -516,6 +511,11 @@ msgstr "" "%s [--file rooted-bestandsnaam] [--user gebruikersnaam] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Uw account is verlopen; neem contact op met uw systeembeheerder" @@ -572,6 +572,10 @@ msgstr "Nieuw UNIX-wachtwoord invoeren: " msgid "Retype new UNIX password: " msgstr "Nieuw UNIX-wachtwoord herhalen: " +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Account vergrendeld wegens %u mislukte aanmeldingen" + #~ msgid "has been already used" #~ msgstr "is al gebruikt" diff --git a/po/or.po b/po/or.po index 117e5375..f4db9a90 100644 --- a/po/or.po +++ b/po/or.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip.or\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-09-30 11:42+0530\n" "Last-Translator: Manoj Kumar Giri \n" "Language-Team: Oriya\n" @@ -171,19 +171,19 @@ msgid "Unknown PAM error" msgstr "ଅଜଣା PAM ତୃଟି" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "ନୂତନ %s%s ପ୍ରବେଶ ସଙ୍କେତ: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "ନୂତନ %s%s ପ୍ରବେଶ ସଙ୍କେତକୁ ପୁନର୍ବାର ଟାଇପ କରନ୍ତୁ: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "କ୍ଷମା କରିବେ, ପ୍ରବେଶ ସଙ୍କେତ ମିଶୁ ନାହିଁ।" @@ -234,7 +234,7 @@ msgid "Password unchanged" msgstr "ପ୍ରବେଶ ସଙ୍କେତ ଅପରିବର୍ତ୍ତିତ ଅଛି" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ଖରାପ ପ୍ରବେଶ ସଙ୍କେତ: %s" @@ -357,14 +357,14 @@ msgstr "ଡ଼ିରେକ୍ଟୋରୀ '%s' ନିର୍ମାଣ କରୁ msgid "Unable to create directory %s: %m" msgstr "ଡ଼ିରେକ୍ଟୋରୀ '%s' ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "ପ୍ରବେଶ ସଙ୍କେତ ଅପରିବର୍ତ୍ତିତ ଅଛି" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "ପ୍ରବେଶ ସଙ୍କେତଟି ପୂର୍ବରୁ ବ୍ଯବହୃତ ହେଉଛି। ଅନ୍ଯ ଗୋଟିଏ ପ୍ରବେଶ ସଙ୍କେତ ଚୟନ କରନ୍ତୁ।" @@ -429,20 +429,20 @@ msgstr "pam_set_item() କରିବାରେ ବିଫଳ\n" msgid "login: failure forking: %m" msgstr "ଲଗଇନ: fork କରିବାରେ ବିଫଳ: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "%s ପାଇଁ STRESS ପ୍ରବେଶ ସଙ୍କେତକୁ ବଦଳାଉଛି." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "ନୂତନ STRESS ପ୍ରବେଶ ସଙ୍କେତ ଭରଣ କରନ୍ତୁ: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "ନୂତନ STRESS ପ୍ରବେଶ ସଙ୍କେତକୁ ପୁନର୍ବାର ଟାଇପ କରନ୍ତୁ: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "ଯାଞ୍ଚକରଣ ସମୟରେ ଭୂଲ ଟାଇପ କରିଛନ୍ତି, ପ୍ରବେଶ ସଙ୍କେତଟି ବଦଳି ନାହିଁ" @@ -451,7 +451,7 @@ msgstr "ଯାଞ୍ଚକରଣ ସମୟରେ ଭୂଲ ଟାଇପ କର msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -494,11 +494,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: ସମସ୍ତ ଚାଳକ ମାନଙ୍କୁ ଶୂନ୍ଯ ବିହୀନ ଭାବରେ ପୁନର୍ବାର ବିନ୍ଯାସ କରିପାରିବ ନାହିଁ\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -513,6 +508,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "ଆପଣଙ୍କର ଖାତା ଅଚଳ ହୋଇଯାଇଛି; ଦୟାକରି ଆପଣଙ୍କ ତନ୍ତ୍ର ପ୍ରଶାସକଙ୍କ ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ" diff --git a/po/pa.po b/po/pa.po index 61bbaa22..ddd22104 100644 --- a/po/pa.po +++ b/po/pa.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.pa\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2005-08-06 08:34+0530\n" "Last-Translator: Amanpreet Singh Alam[ਆਲਮ] \n" "Language-Team: Panjabi \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "ਅਣਜਾਣ PAM ਗਲਤੀ" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, fuzzy, c-format msgid "New %s%spassword: " msgstr "ਗੁਪਤ-ਕੋਡ ਨਾ-ਤਬਦੀਲ ਹੈ" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, fuzzy, c-format msgid "Retype new %s%spassword: " msgstr "ਨਵਾਂ STRESS ਗੁਪਤ-ਕੋਡ ਮੁੜ-ਲਿਖੋ: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 #, fuzzy msgid "Sorry, passwords do not match." msgstr "NIS ਗੁਪਤ-ਕੋਡ ਤਬਦੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।" @@ -233,7 +233,7 @@ msgid "Password unchanged" msgstr "ਗੁਪਤ-ਕੋਡ ਨਾ-ਤਬਦੀਲ ਹੈ" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "" @@ -357,14 +357,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "ਗੁਪਤ-ਕੋਡ ਨਾ-ਤਬਦੀਲ ਹੈ" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "ਗੁਪਤ-ਕੋਡ ਪਹਿਲਾਂ ਵੀ ਵਰਤਿਆ ਗਿਆ ਹੈ। ਵੱਖਰਾ ਚੁਣੋ।" @@ -433,20 +433,20 @@ msgstr "pam_set_item() ਲਈ ਫੇਲ\n" msgid "login: failure forking: %m" msgstr "" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "ਨਵਾਂ STRESS ਗੁਪਤ-ਕੋਡ ਦਿਓ: " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "ਨਵਾਂ STRESS ਗੁਪਤ-ਕੋਡ ਦਿਓ: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "ਨਵਾਂ STRESS ਗੁਪਤ-ਕੋਡ ਮੁੜ-ਲਿਖੋ: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "" @@ -455,7 +455,7 @@ msgstr "" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -498,11 +498,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -517,6 +512,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/pl.po b/po/pl.po index 62c92a45..9ceda20b 100644 --- a/po/pl.po +++ b/po/pl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pl\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-14 23:49+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" @@ -168,19 +168,19 @@ msgid "Unknown PAM error" msgstr "Nieznany błąd PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nowe hasło %s%s: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Ponownie podaj nowe hasło %s%s: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Podane hasła nie są zgodne." @@ -231,7 +231,7 @@ msgid "Password unchanged" msgstr "Hasło nie zostało zmienione" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "BŁĘDNE HASŁO: %s" @@ -359,13 +359,13 @@ msgstr "Tworzenie katalogu \"%s\"." msgid "Unable to create directory %s: %m" msgstr "Nie można utworzyć katalogu %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Przerwano zmianę hasła." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Hasło było już używane. Wybierz inne." @@ -430,20 +430,20 @@ msgstr "pam_set_item() nie powiodło się\n" msgid "login: failure forking: %m" msgstr "login: rozdzielenie nie powiodło się: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Zmienianie hasła STRESS dla %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Podaj nowe hasło STRESS: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Ponownie podaj hasła STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Sprawdzenie nie powiodło się; hasło nie zostało zmienione" @@ -452,7 +452,7 @@ msgstr "Sprawdzenie nie powiodło się; hasło nie zostało zmienione" msgid "Account temporary locked (%ld seconds left)" msgstr "Konto zostało tymczasowo zablokowane (pozostało %ld sekund)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Konto zostało zablokowane z powodu %u nieudanych logowań" @@ -496,11 +496,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: nie można przywrócić wszystkich użytkowników\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Konto zostało zablokowane z powodu %u nieudanych logowań" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -516,6 +511,11 @@ msgstr "" "%s: [--file nazwa-pliku-root] [--user nazwa-użytkownika] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Konto wygasło; skontaktuj się z administratorem systemu" @@ -570,3 +570,7 @@ msgstr "Podaj nowe hasło UNIX: " #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "Ponownie podaj hasło UNIX: " + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Konto zostało zablokowane z powodu %u nieudanych logowań" diff --git a/po/pt.po b/po/pt.po index acfeaf7f..303c6208 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.pt\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2006-05-03 21:54+0200\n" "Last-Translator: Antonio Cardoso Martins \n" "Language-Team: portuguese\n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "Erro PAM desconhecido" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nova %s%spalavra passe: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Digite novamente a nova %s%spalavra passe: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Lamento, as palavras passe não coincidem." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "Palavra passe inalterada" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "MÁ PALAVRA PASSE: %s" @@ -353,14 +353,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Palavra passe inalterada" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "A palavra passe já foi anteriormente utilizada. Escolha outra." @@ -429,20 +429,20 @@ msgstr "falha em pam_set_item()\n" msgid "login: failure forking: %m" msgstr "sessão: falha ao executar o forking: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "A alterar a palavra passe de STRESS para " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Digite a nova palavra passe de STRESS: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Digite novamente a nova palavra passe de STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "A verificação não coincide; palavra passe inalterada" @@ -451,7 +451,7 @@ msgstr "A verificação não coincide; palavra passe inalterada" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -494,11 +494,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Não foi possível reiniciar todos os utilizadores para não zero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -513,6 +508,11 @@ msgid "" msgstr "" "%s: [--file ficheiro-raiz] [--user nome-utilizador] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po index f34c072c..f235f646 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-22 17:25-0300\n" "Last-Translator: Taylon \n" "Language-Team: Brazilian Portuguese \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "Erro desconhecido no PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nova %s%ssenha:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Redigite a nova %s%ssenha:" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "As senhas não são iguais." @@ -232,7 +232,7 @@ msgid "Password unchanged" msgstr "Senha inalterada" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "SENHA INCORRETA: %s" @@ -355,13 +355,13 @@ msgstr "Criando o diretório '%s'." msgid "Unable to create directory %s: %m" msgstr "Impossível criar o diretório %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "A alteração de senha foi abortada." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "A senha já foi usada. Escolha outra." @@ -426,20 +426,20 @@ msgstr "falha em pam_set_item()\n" msgid "login: failure forking: %m" msgstr "login: falha na bifurcação: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Mudando senha STRESS para %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Digite a nova senha STRESS:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Digite novamente a nova senha STRESS:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Verificação digitada incorretamente; senha inalterada" @@ -448,7 +448,7 @@ msgstr "Verificação digitada incorretamente; senha inalterada" msgid "Account temporary locked (%ld seconds left)" msgstr "Conta temporariamente bloqueada (restam %ld segundos)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Conta bloqueada devido a %u falhas de login" @@ -491,11 +491,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Impossível redefinir todos os usuários para não-zero\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Conta bloqueada devido a %u falhas de login" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -510,6 +505,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Sua conta expirou; entre em contato com o administrador do sistema" @@ -564,6 +564,10 @@ msgstr "Digite a nova senha UNIX:" msgid "Retype new UNIX password: " msgstr "Redigite a nova senha UNIX:" +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Conta bloqueada devido a %u falhas de login" + #~ msgid "has been already used" #~ msgstr "já foi usada" diff --git a/po/ru.po b/po/ru.po index e2708a2b..0cc6d9dd 100644 --- a/po/ru.po +++ b/po/ru.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-02-23 20:11+0300\n" "Last-Translator: Andrew Martynov \n" "Language-Team: Russian \n" @@ -175,20 +175,20 @@ msgid "Unknown PAM error" msgstr "Неизвестная ошибка PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Новый пароль %s%s: " # Keep the newlines and spaces after ':'! #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Повторите ввод нового пароля %s%s: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Извините, но пароли не совпадают." @@ -240,7 +240,7 @@ msgid "Password unchanged" msgstr "Пароль не изменен" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "НЕВЕРНЫЙ ПАРОЛЬ: %s" @@ -365,14 +365,14 @@ msgid "Unable to create directory %s: %m" msgstr "Невозможно создать каталог %s: %m" # password dialog title -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Пароль не изменен" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Этот пароль уже был использован. Выберите другой." @@ -439,21 +439,21 @@ msgstr "не удалось выполнить pam_set_item()\n" msgid "login: failure forking: %m" msgstr "регистрация: сбой при создании нового процесса: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Смена пароля STRESS для %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Введите новый пароль STRESS: " # Keep the newlines and spaces after ':'! -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Повторите ввод нового пароля STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Подтверждение введено неправильно; пароль не изменен" @@ -462,7 +462,7 @@ msgstr "Подтверждение введено неправильно; пар msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -507,11 +507,6 @@ msgid "%s: Can't reset all users to non-zero\n" msgstr "" "%s: не удается выполнить сброс всех пользователей в ненулевое значение\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -527,6 +522,11 @@ msgstr "" "%s: [--file имя_корневого_файла] [--user имя_пользователя] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/si.po b/po/si.po index a8fa2d1f..ac57fe16 100644 --- a/po/si.po +++ b/po/si.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: si\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2007-06-22 12:24+0530\n" "Last-Translator: Danishka Navin \n" "Language-Team: Sinhala \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "නොදන්නා PAM දෝෂය" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "නව %s%sරහස්පදය: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "නව %s%sරහස්පදය නැවත ඇතුළත් කරන්න: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "සමාවෙන්න, රහස්පද ගැලපෙන්නේ නැත." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "රහස්පදය වෙනස් නොවිනි" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "BAD PASSWORD: %s" @@ -353,14 +353,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "රහස්පදය වෙනස් නොවිනි" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "රහස්පදය දැනටමත් භාවිතා වේ. වෙනත් එකක් තෝරාගන්න." @@ -429,20 +429,20 @@ msgstr "pam_set_item() අසමත් විය\n" msgid "login: failure forking: %m" msgstr "පිවිසුම: ෆොර්කින් බිදවැටීමක්: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "STRESS රහස්පදය වෙනස් කරමින්" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "නව STRESS රහස්පදය ඇතුළත් කරන්න:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "නව STRESS රහස්පදය නැවත ඇතුළත් කරන්න:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "ස්ථිරකර ගැනීම සඳහා වැරදි ඇතුලත් කිරීමක්; රහස්පදය වෙනස් කළ නොහැක" @@ -451,7 +451,7 @@ msgstr "ස්ථිරකර ගැනීම සඳහා වැරදි ඇ msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -494,11 +494,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: ශුන්‍ය නොවන අගයට සියළුම පරිශීලකයින් නැවත සැකසිය නොහැක\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -513,6 +508,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "ඔබගේ ගිණුම කල්ඉකුත් වී ඇත; කරුණාකර ඔබගේ පද්ධති කළමණාකරු හමුවන්න" diff --git a/po/sk.po b/po/sk.po index 01e13953..7e7c7612 100644 --- a/po/sk.po +++ b/po/sk.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-21 09:13+0200\n" "Last-Translator: Ondrej Šulek \n" "Language-Team: Slovak \n" @@ -166,19 +166,19 @@ msgid "Unknown PAM error" msgstr "Neznáme chyba PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nové %s%sheslo: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Opakujte nové %s%sheslo: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Heslá sa nezhodujú." @@ -229,7 +229,7 @@ msgid "Password unchanged" msgstr "Heslo nebolo zmenené" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "NESPRÁVNE HESLO: %s" @@ -361,13 +361,13 @@ msgstr "Vytváranie priečinka '%s'." msgid "Unable to create directory %s: %m" msgstr "Nedá sa vytvoriť priečinok %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "Zmena hesla prerušená." -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Heslo už bolo použité. Vyberte iné." @@ -432,20 +432,20 @@ msgstr "chyba pam_set_item()\n" msgid "login: failure forking: %m" msgstr "login: chyba forku: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Zmena STRESS hesla pre %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Zadajte nové STRESS heslo: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Znovu zadajte nové STRESS heslo: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Chybné potvrdenie; heslo nezmenené" @@ -454,7 +454,7 @@ msgstr "Chybné potvrdenie; heslo nezmenené" msgid "Account temporary locked (%ld seconds left)" msgstr "Účet dočasne uzamknutý (zostáva %ld sekúnd)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "Účet uzamknutý z dôvodu %u neúspešných prihlásení" @@ -498,11 +498,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Nedá sa resetovať všetkých používateľov nenulovo\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "Účet uzamknutý z dôvodu %u neúspešných prihlásení" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -518,6 +513,11 @@ msgstr "" "%s: [--file meno_suboru] [--user pouzivatelske_meno] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" @@ -574,6 +574,10 @@ msgstr "Zadajte nové UNIX heslo: " msgid "Retype new UNIX password: " msgstr "Opakujte nové UNIX heslo: " +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "Účet uzamknutý z dôvodu %u neúspešných prihlásení" + #~ msgid "has been already used" #~ msgstr "už bolo použité" diff --git a/po/sr.po b/po/sr.po index 2696833a..10b664fb 100644 --- a/po/sr.po +++ b/po/sr.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-04-05 10:48+0100\n" "Last-Translator: Miloš Komarčević \n" "Language-Team: Serbian (sr) \n" @@ -171,19 +171,19 @@ msgid "Unknown PAM error" msgstr "Непозната PAM грешка" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Нова %s%sлозинка: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Поновите нову %s%sлозинку: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Извините, лозинке се не подударају." @@ -234,7 +234,7 @@ msgid "Password unchanged" msgstr "Лозинка непромењена" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ЛОША ЛОЗИНКА: %s" @@ -358,14 +358,14 @@ msgstr "Правим директоријум „%s“." msgid "Unable to create directory %s: %m" msgstr "Не могу да направим директоријум %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Лозинка непромењена" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Лозинка је већ у употреби. Изаберите другу." @@ -430,20 +430,20 @@ msgstr "неуспешно покретање функције pam_set_item()\n" msgid "login: failure forking: %m" msgstr "пријава: грешка при гранању: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Промена STRESS лозинке за %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Унесите нову STRESS лозинку: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Поново унесите нову STRESS лозинку: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Провера неуспешна; лозинка непромењена" @@ -452,7 +452,7 @@ msgstr "Провера неуспешна; лозинка непромењена msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -496,11 +496,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: не могу да поништим све кориснике на не-нулту вредност\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -516,6 +511,11 @@ msgstr "" "%s: [--file коренски-називдатотеке] [--user корисничкоиме] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Ваш налог је истекао; молим контактирајте администратора система" diff --git a/po/sr@latin.po b/po/sr@latin.po index ff5743fe..117774fe 100644 --- a/po/sr@latin.po +++ b/po/sr@latin.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-04-05 10:48+0100\n" "Last-Translator: Miloš Komarčević \n" "Language-Team: Serbian (sr) \n" @@ -171,19 +171,19 @@ msgid "Unknown PAM error" msgstr "Nepoznata PAM greška" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nova %s%slozinka: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Ponovite novu %s%slozinku: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Izvinite, lozinke se ne podudaraju." @@ -234,7 +234,7 @@ msgid "Password unchanged" msgstr "Lozinka nepromenjena" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "LOŠA LOZINKA: %s" @@ -358,14 +358,14 @@ msgstr "Pravim direktorijum „%s“." msgid "Unable to create directory %s: %m" msgstr "Ne mogu da napravim direktorijum %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Lozinka nepromenjena" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Lozinka je već u upotrebi. Izaberite drugu." @@ -430,20 +430,20 @@ msgstr "neuspešno pokretanje funkcije pam_set_item()\n" msgid "login: failure forking: %m" msgstr "prijava: greška pri grananju: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "Promena STRESS lozinke za %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Unesite novu STRESS lozinku: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Ponovo unesite novu STRESS lozinku: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Provera neuspešna; lozinka nepromenjena" @@ -452,7 +452,7 @@ msgstr "Provera neuspešna; lozinka nepromenjena" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -496,11 +496,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: ne mogu da poništim sve korisnike na ne-nultu vrednost\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -516,6 +511,11 @@ msgstr "" "%s: [--file korenski-nazivdatoteke] [--user korisničkoime] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Vaš nalog je istekao; molim kontaktirajte administratora sistema" diff --git a/po/sv.po b/po/sv.po index f7b88bb7..be104909 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2007-12-24 13:39+0100\n" "Last-Translator: Christer Andersson \n" "Language-Team: Swedish \n" @@ -166,19 +166,19 @@ msgid "Unknown PAM error" msgstr "Oknt PAM-fel" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Nytt %s%slsenord: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Ange nytt %s%slsenord igen: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Ledsen, lsenorden stmmer inte verens." @@ -229,7 +229,7 @@ msgid "Password unchanged" msgstr "Ofrndrat lsenord" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "DLIGT LSENORD: %s" @@ -352,14 +352,14 @@ msgstr "Skapar katalogen \"%s\"." msgid "Unable to create directory %s: %m" msgstr "Kan inte skapa katalogen %s: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Ofrndrat lsenord" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Lsenordet har redan anvnds. Vlj ett annat." @@ -424,20 +424,20 @@ msgstr "pam_set_item() misslyckades\n" msgid "login: failure forking: %m" msgstr "inloggning: fel vid grening: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "ndrar STRESS-lsenord fr %s." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Ange nytt STRESS-lsenord: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Ange nytt STRESS-lsenord igen: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Felskriven verifikation, lsenord ofrndrat" @@ -446,7 +446,7 @@ msgstr "Felskriven verifikation, l msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -489,11 +489,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Kan inte stlla om alla anvndare till nollskilt vrde\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -508,6 +503,11 @@ msgid "" msgstr "" "%s: [--file absolut-filnamn] [--user anvndarnamn] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Ditt konto har gtt ut. Kontakta din systemadministratr" diff --git a/po/ta.po b/po/ta.po index eec8d21c..7deb035d 100644 --- a/po/ta.po +++ b/po/ta.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ta\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2007-06-21 15:33+0530\n" "Last-Translator: I felix \n" "Language-Team: Tamil \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "தெரியாத PAM பிழை" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "புதிய %s%spassword: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "புதிய %s%spassword மீண்டும் உள்ளிடவும்: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "கடவுச்சொல் பொருந்தவில்லை." @@ -232,7 +232,7 @@ msgid "Password unchanged" msgstr "கடவுச்சொல் மாற்றப்படவில்லை" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "தவறான கடவுச்சொல்: %s" @@ -355,14 +355,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "கடவுச்சொல் மாற்றப்படவில்லை" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "கடவுச்சொல் ஏற்கனவே பயன்படுத்தப்பட்டது. வேறொன்றை பயன்படுத்தவும்." @@ -431,20 +431,20 @@ msgstr "pam_set_item() செயலிழக்கப்பட்டது\n" msgid "login: failure forking: %m" msgstr "login: failure forking: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "STRESS கடவுச்சொல்லை மாற்றுகிறது" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "புதிய STRESS கடவுச்சொல்லை உள்ளிடவும்: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "புதிய STRESS கடவுச்சொல்லை மீண்டும் உள்ளிடவும்: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "உறுதிப்படுத்தல் முரண்பாடு; கடவுச்சொல் மாற்றப்படவில்லை" @@ -453,7 +453,7 @@ msgstr "உறுதிப்படுத்தல் முரண்பாட msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -496,11 +496,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: பூஜ்ஜியமில்லாததற்கு அனைத்து பயனர்களையும் மறு அமைக்க முடியவில்லை\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -515,6 +510,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "உங்கள் கணக்கு முடிவுற்றது, உங்கள் கணினி நிர்வாகியை அணுகவும்" diff --git a/po/te.po b/po/te.po index 1cfffc13..702a53fe 100644 --- a/po/te.po +++ b/po/te.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: te\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-22 16:24+0530\n" "Last-Translator: Krishna Babu K \n" "Language-Team: Telugu \n" @@ -170,19 +170,19 @@ msgid "Unknown PAM error" msgstr "తెలియని PAM దోషము" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "కొత్త %s%sసంకేతపదము: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "కొత్త %s%sసంకేతపదమును మరలాటైపుచేయుము: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "క్షమించాలి, సంకేతపదము సరిపోలలేదు." @@ -233,7 +233,7 @@ msgid "Password unchanged" msgstr "సంకేతపదము మార్చలేదు" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "చెడ్డ సంకేతపదము: %s" @@ -356,13 +356,13 @@ msgstr "డెరెక్టరీ '%s' సృష్టించుట." msgid "Unable to create directory %s: %m" msgstr "డైరెక్టరీ %sను సృష్టించలేక పోయింది: %m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "సంకేతపదము మార్పు తప్పించబడింది" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "సంకేతపదము యిప్పటికే వుపయోగించబడింది. మరియొకదానిని యెంచుకొనుము." @@ -427,20 +427,20 @@ msgstr "pam_set_item() విఫలమైంది\n" msgid "login: failure forking: %m" msgstr "login: failure forking: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "STRESS సంకేతపదమును %sకొరకు మార్చబడింది." -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "కొత్త STRESS సంకేతపదమును ప్రవేశపెట్టుము: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "కొత్త STRESS సంకేతపదమును తిరిగిటైపుచేయుము: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "తప్పుగా-చేసినటైపు నిర్ధారణ; సంకేతపదము మార్చబడలేదు" @@ -449,7 +449,7 @@ msgstr "తప్పుగా-చేసినటైపు నిర్ధార msgid "Account temporary locked (%ld seconds left)" msgstr "ఖాతా తాత్కాలికంగా లాక్‌చేయబడింది (%ld సెకనులు మిగిలినవి)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "%u లాగిన్‌ల వైఫల్యం కారణంగా ఖాతా లాక్అయింది" @@ -492,11 +492,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: వినియోగదారులనందరిని సున్నా-కానిదానికి తిరిగివుంచలేము\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "%u లాగిన్‌ల వైఫల్యం కారణంగా ఖాతా లాక్అయింది" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -511,6 +506,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "మీ ఖాతా కాలముతీరినది; దయచేసి మీ సిస్టమ్ నిర్వాహకుడిని సంప్రదించండి" @@ -564,3 +564,7 @@ msgstr "కొత్త UNIX సంకేతపదమును ప్రవే #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "కొత్త UNIX సంకేతపదమును తిరిగిటైపు చేయుము: " + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "%u లాగిన్‌ల వైఫల్యం కారణంగా ఖాతా లాక్అయింది" diff --git a/po/tr.po b/po/tr.po index df141f73..9ad9187f 100644 --- a/po/tr.po +++ b/po/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2006-05-03 19:00+0200\n" "Last-Translator: Koray Löker \n" "Language-Team: Türkçe \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "Bilinmeyen PAM hatası" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Yeni %s%sparolası: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Yeni %s%sparolasını tekrar girin: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Üzgünüm, parolalar birbirine uymuyor." @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "Parola değiştirilmedi" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "YANLIŞ PAROLA: %s" @@ -352,14 +352,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Parola değiştirilmedi" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Parola kullanımda. Lütfen başka bir parola seçin." @@ -428,20 +428,20 @@ msgstr "pam_set_item() çalıştırılamadı\n" msgid "login: failure forking: %m" msgstr "giriş: çatallama yapılamadı: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "STRESS parolası değiştiriliyor " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Yeni STRESS parolası girin: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Yeni STRESS parolasını tekrar girin: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Doğrulama hatalı: parola değiştirilmedi" @@ -450,7 +450,7 @@ msgstr "Doğrulama hatalı: parola değiştirilmedi" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -493,11 +493,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -512,6 +507,11 @@ msgid "" msgstr "" "%s: [--file DosyanınTamYolu] [--user KullanıcıAdı] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "Hesabınızın süresi doldu; lütfen sistem yöneticinizle bağlantıya geçin" diff --git a/po/uk.po b/po/uk.po index 67525024..e258e6ae 100644 --- a/po/uk.po +++ b/po/uk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.uk\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2006-05-03 18:59+0200\n" "Last-Translator: Ivan Petrouchtchak \n" "Language-Team: Ukrainian \n" @@ -168,19 +168,19 @@ msgid "Unknown PAM error" msgstr "Невідома помилка PAM" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "Новий пароль %s%s:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Повторіть новий пароль %s%s: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Ваші нові паролі не співпадають." @@ -231,7 +231,7 @@ msgid "Password unchanged" msgstr "Пароль не змінено" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "ПОГАНИЙ ПАРОЛЬ: %s" @@ -355,14 +355,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Пароль не змінено" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Пароль вже вживається. Виберіть інший." @@ -431,20 +431,20 @@ msgstr "помилка pam_set_item()\n" msgid "login: failure forking: %m" msgstr "вхід: помилка розгалуження: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "Зміна пароля STRESS для " -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Введіть новий пароль STRESS: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Повторіть новий пароль STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Перевірку не пройдено; пароль не змінено" @@ -453,7 +453,7 @@ msgstr "Перевірку не пройдено; пароль не змінен msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -497,11 +497,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: Не вдається скинути всіх користувачів до не-нуль\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -517,6 +512,11 @@ msgstr "" "%s: [--file rooted-filename] [--user ім'я користувача] [--reset[=n]] [--" "quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po index 4d251989..32e41700 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-20 15:43+1000\n" "Last-Translator: Leah Liu \n" "Language-Team: Simplified Chinese \n" @@ -169,19 +169,19 @@ msgid "Unknown PAM error" msgstr "未知的 PAM 错误" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "新的 %s%s密码:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "重新输入新的 %s%s密码:" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "抱歉,密码不匹配。" @@ -232,7 +232,7 @@ msgid "Password unchanged" msgstr "密码未更改" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "无效的密码: %s" @@ -354,13 +354,13 @@ msgstr "创建目录 '%s'。" msgid "Unable to create directory %s: %m" msgstr "无法创建目录 %s:%m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 msgid "Password change aborted." msgstr "密码更改取消。" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "密码已使用。请选择其他密码。" @@ -425,20 +425,20 @@ msgstr "未能 pam_set_item()\n" msgid "login: failure forking: %m" msgstr "登录:故障派生:%m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "为 %s 更改 STRESS 密码。" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "输入新的 STRESS 密码:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "重新输入新的 STRESS 密码:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "校验类型错误;密码未更改" @@ -447,7 +447,7 @@ msgstr "校验类型错误;密码未更改" msgid "Account temporary locked (%ld seconds left)" msgstr "帐户暂时锁住(还有 %ld 秒)" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "因为 %u 失败登录而锁定帐户" @@ -489,11 +489,6 @@ msgstr "%s: [--文件 根文件名] [--用户 用户名] [--重设置[=n]] [-- msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: 无法将所有用户重设置为非零\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, fuzzy, c-format -msgid "Account locked due to %hu failed logins" -msgstr "因为 %u 失败登录而锁定帐户" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -507,6 +502,11 @@ msgid "" " [-r] [--reset[=n]] [--quiet]\n" msgstr "%s: [--文件 根文件名] [--用户 用户名] [--重设置[=n]] [--安静]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "您的帐户已失效;请与系统管理员取得联系" @@ -559,3 +559,7 @@ msgstr "输入新的 UNIX 密码:" #: modules/pam_unix/pam_unix_passwd.c:678 msgid "Retype new UNIX password: " msgstr "重新输入新的 UNIX 密码:" + +#, fuzzy +#~ msgid "Account locked due to %hu failed logins" +#~ msgstr "因为 %u 失败登录而锁定帐户" diff --git a/po/zh_TW.po b/po/zh_TW.po index a712bb58..d1682ebe 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM.tip\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2008-10-21 15:51+1000\n" "Last-Translator: Terry Chuang \n" "Language-Team: \n" @@ -167,19 +167,19 @@ msgid "Unknown PAM error" msgstr "未知的 PAM 錯誤" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "新 %s%s密碼:" #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "再次輸入新的 %s%s密碼:" #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "抱歉,密碼不符合。" @@ -230,7 +230,7 @@ msgid "Password unchanged" msgstr "密碼未變更" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "不良的密碼: %s" @@ -353,14 +353,14 @@ msgstr "建立目錄「%s」。" msgid "Unable to create directory %s: %m" msgstr "無法建立 %s 目錄:%m" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "密碼未變更" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "密碼已經由其他使用者使用。請選擇其他密碼。" @@ -425,20 +425,20 @@ msgstr "pam_set_item() 失敗\n" msgid "login: failure forking: %m" msgstr "登入:失敗的分叉:%m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, c-format msgid "Changing STRESS password for %s." msgstr "正在更改 %s 的 STRESS 密碼。" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "輸入新的 STRESS 密碼:" -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "再次輸入新的 STRESS 密碼:" -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "確認錯誤輸入;密碼未變更" @@ -447,7 +447,7 @@ msgstr "確認錯誤輸入;密碼未變更" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -490,11 +490,6 @@ msgstr "" msgid "%s: Can't reset all users to non-zero\n" msgstr "%s: 無法將所有使用者重新設定為非零\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -509,6 +504,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "您的帳戶已經逾期,請洽詢您的系統管理員" diff --git a/po/zu.po b/po/zu.po index a9c0afc1..195b8939 100644 --- a/po/zu.po +++ b/po/zu.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Linux-PAM\n" "Report-Msgid-Bugs-To: http://sourceforge.net/projects/pam\n" -"POT-Creation-Date: 2008-10-22 20:01+0200\n" +"POT-Creation-Date: 2008-11-28 15:16+0100\n" "PO-Revision-Date: 2006-11-03 12:03\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" @@ -163,19 +163,19 @@ msgid "Unknown PAM error" msgstr "Iphutha le-PAM elingaziwa" #: modules/pam_cracklib/pam_cracklib.c:64 -#: modules/pam_pwhistory/pam_pwhistory.c:61 +#: modules/pam_pwhistory/pam_pwhistory.c:62 #, c-format msgid "New %s%spassword: " msgstr "%s%siphasiwedi entsha: " #: modules/pam_cracklib/pam_cracklib.c:66 -#: modules/pam_pwhistory/pam_pwhistory.c:62 +#: modules/pam_pwhistory/pam_pwhistory.c:64 #, c-format msgid "Retype new %s%spassword: " msgstr "Thayipha kabusha %s%siphasiwedi entsha: " #: modules/pam_cracklib/pam_cracklib.c:67 -#: modules/pam_pwhistory/pam_pwhistory.c:63 +#: modules/pam_pwhistory/pam_pwhistory.c:65 msgid "Sorry, passwords do not match." msgstr "Uxolo, amaphasiwedi awahambelani." @@ -226,7 +226,7 @@ msgid "Password unchanged" msgstr "Iphasiwedi ayishintshwanga" #: modules/pam_cracklib/pam_cracklib.c:584 -#: modules/pam_cracklib/pam_cracklib.c:709 +#: modules/pam_cracklib/pam_cracklib.c:710 #, c-format msgid "BAD PASSWORD: %s" msgstr "IPHASIWEDI ENGASEBENZI: %s" @@ -349,14 +349,14 @@ msgstr "" msgid "Unable to create directory %s: %m" msgstr "" -#: modules/pam_pwhistory/pam_pwhistory.c:224 -#: modules/pam_pwhistory/pam_pwhistory.c:258 +#: modules/pam_pwhistory/pam_pwhistory.c:231 +#: modules/pam_pwhistory/pam_pwhistory.c:267 #, fuzzy msgid "Password change aborted." msgstr "Iphasiwedi ayishintshwanga" -#: modules/pam_pwhistory/pam_pwhistory.c:235 -#: modules/pam_pwhistory/pam_pwhistory.c:295 +#: modules/pam_pwhistory/pam_pwhistory.c:242 +#: modules/pam_pwhistory/pam_pwhistory.c:304 #: modules/pam_unix/pam_unix_passwd.c:470 msgid "Password has been already used. Choose another." msgstr "Le phasiwedi isetshenziswa ngothile. Khetha enye." @@ -425,20 +425,20 @@ msgstr "Ihlulekile ukwenza i-pam_set_item()\n" msgid "login: failure forking: %m" msgstr "ngena: Ihlulekile ukuhlukanisa: %m" -#: modules/pam_stress/pam_stress.c:476 +#: modules/pam_stress/pam_stress.c:475 #, fuzzy, c-format msgid "Changing STRESS password for %s." msgstr "Ukushintsha iphasiwedi ye-STRESS ye-" -#: modules/pam_stress/pam_stress.c:490 +#: modules/pam_stress/pam_stress.c:489 msgid "Enter new STRESS password: " msgstr "Faka iphasiwedi entsha ye-STRESS: " -#: modules/pam_stress/pam_stress.c:493 +#: modules/pam_stress/pam_stress.c:492 msgid "Retype new STRESS password: " msgstr "Thayipha iphasiwedi entsha ye-STRESS: " -#: modules/pam_stress/pam_stress.c:522 +#: modules/pam_stress/pam_stress.c:521 msgid "Verification mis-typed; password unchanged" msgstr "Ukufakazela akuthayiphiwanga kahle; iphasiwedi ayishintshwanga" @@ -447,7 +447,7 @@ msgstr "Ukufakazela akuthayiphiwanga kahle; iphasiwedi ayishintshwanga" msgid "Account temporary locked (%ld seconds left)" msgstr "" -#: modules/pam_tally/pam_tally.c:566 +#: modules/pam_tally/pam_tally.c:566 modules/pam_tally2/pam_tally2.c:520 #, c-format msgid "Account locked due to %u failed logins" msgstr "" @@ -492,11 +492,6 @@ msgstr "" "%s: Ayikwazi ukusetha kabusha bonke abasebenzisi ibase enombolweni ongelona " "iqanda\n" -#: modules/pam_tally2/pam_tally2.c:520 -#, c-format -msgid "Account locked due to %hu failed logins" -msgstr "" - #: modules/pam_tally2/pam_tally2.c:865 #, c-format msgid "Login Failures Latest failure From\n" @@ -511,6 +506,11 @@ msgid "" msgstr "" "%s: [--file rooted-filename] [--user username] [--reset[=n]] [--quiet]\n" +#: modules/pam_timestamp/pam_timestamp.c:339 +#, c-format +msgid "Access granted (last access was %ld seconds ago)." +msgstr "" + #: modules/pam_unix/pam_unix_acct.c:228 modules/pam_unix/pam_unix_acct.c:250 msgid "Your account has expired; please contact your system administrator" msgstr "" -- cgit v1.2.3