Compare commits
365 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2cc7da6058 | ||
|
|
142d788c81 | ||
|
|
33c6a170a5 | ||
|
|
fd4405b763 | ||
|
|
dfceca8427 | ||
|
|
54c1660969 | ||
|
|
eebcacfae8 | ||
|
|
4ed08824e5 | ||
|
|
3e942adb21 | ||
|
|
085d04c3dd | ||
|
|
ed4a0157c4 | ||
|
|
93f1f35123 | ||
|
|
9f7f3b013e | ||
|
|
5a6ddf3b57 | ||
|
|
0512c187c8 | ||
|
|
f32d4a359b | ||
|
|
401d0743af | ||
|
|
a847899b52 | ||
|
|
88c1a6d98d | ||
|
|
ef095ceef1 | ||
|
|
4c9ec2f5a4 | ||
|
|
d7add53f06 | ||
|
|
2aa7427e2b | ||
|
|
1ec36eabb2 | ||
|
|
bd3c39f1c8 | ||
|
|
258944e331 | ||
|
|
51d65f37e5 | ||
|
|
0f332f48bc | ||
|
|
a73d4aee75 | ||
|
|
7f53048875 | ||
|
|
b1a5cda91e | ||
|
|
66b7bc0dcf | ||
|
|
eaaac67d4f | ||
|
|
3cc3948d71 | ||
|
|
08096ed24a | ||
|
|
92a678c250 | ||
|
|
81de782d1e | ||
|
|
d83eccdded | ||
|
|
681b66b13c | ||
|
|
2958bd050b | ||
|
|
38f493aff2 | ||
|
|
19bac44dde | ||
|
|
b49712ed32 | ||
|
|
cdbe1310cc | ||
|
|
b462f5335f | ||
|
|
115a4e89e2 | ||
|
|
9d935d9be1 | ||
|
|
7eca1112fb | ||
|
|
fe2a266c50 | ||
|
|
e97df9b1ec | ||
|
|
d048459d36 | ||
|
|
88fa0651bf | ||
|
|
4e038f3ae7 | ||
|
|
6c6c8d3a33 | ||
|
|
a8a921184f | ||
|
|
cbd2472b7c | ||
|
|
a0efca4581 | ||
|
|
4e1da34601 | ||
|
|
b03df41906 | ||
|
|
8ca6eea938 | ||
|
|
1c2ad5e6b9 | ||
|
|
991fee82df | ||
|
|
b52ce71c27 | ||
|
|
e78d22469f | ||
|
|
c4e8b411d4 | ||
|
|
3a51b90145 | ||
|
|
a2cd3e9ef0 | ||
|
|
1cbb562c23 | ||
|
|
558977bb2b | ||
|
|
332709da65 | ||
|
|
a74587a4ea | ||
|
|
1e13749483 | ||
|
|
1a1b8fcc36 | ||
|
|
23262b249c | ||
|
|
5687be5f31 | ||
|
|
e293aa9cfc | ||
|
|
edf7547ad5 | ||
|
|
2cac079ef4 | ||
|
|
5afc1c5b5f | ||
|
|
3025fefc41 | ||
|
|
00a5cff244 | ||
|
|
fc0ed79e5d | ||
|
|
13c618465d | ||
|
|
3c52a84ff8 | ||
|
|
2bb99b8fe6 | ||
|
|
d2808b1b51 | ||
|
|
b679cdbd3e | ||
|
|
a5f034f272 | ||
|
|
82fa6eccf9 | ||
|
|
8d39357c84 | ||
|
|
aff40d8515 | ||
|
|
51cfc1f89a | ||
|
|
816220f90c | ||
|
|
50b23584d7 | ||
|
|
c1d36a8acb | ||
|
|
caefe9e8de | ||
|
|
64d7688acb | ||
|
|
408b8a5482 | ||
|
|
ce2941ca0d | ||
|
|
47797ca665 | ||
|
|
1697c192ac | ||
|
|
5837240451 | ||
|
|
2c8171f8c8 | ||
|
|
fbb59823c5 | ||
|
|
fe87a1ad96 | ||
|
|
38e3e35c72 | ||
|
|
a8f7132113 | ||
|
|
3d921155e0 | ||
|
|
fe34a2a0e4 | ||
|
|
e24deea4c9 | ||
|
|
d6276066dd | ||
|
|
d2e1e9ce85 | ||
|
|
e61db2c618 | ||
|
|
c40c49536e | ||
|
|
dd2033c40c | ||
|
|
d66a1fe069 | ||
|
|
beb75c6fd6 | ||
|
|
c0c2b99164 | ||
|
|
ebad423023 | ||
|
|
c5898d9f02 | ||
|
|
ee87cda65d | ||
|
|
5b41b7d1b1 | ||
|
|
4633164857 | ||
|
|
59c2dabb26 | ||
|
|
42324e5017 | ||
|
|
52c081b02c | ||
|
|
bb3f810611 | ||
|
|
d5255da20b | ||
|
|
70971457b7 | ||
|
|
ff8b1ebafa | ||
|
|
83f1380600 | ||
|
|
1ecca8439d | ||
|
|
58ee899dce | ||
|
|
10e388efc2 | ||
|
|
fb97da1ce1 | ||
|
|
4aaf05d72e | ||
|
|
6bf2d74dfc | ||
|
|
4be18d3299 | ||
|
|
0d725c1e60 | ||
|
|
3c69af9ed3 | ||
|
|
89b96cb85c | ||
|
|
99dbd4b9ee | ||
|
|
67ec1a5266 | ||
|
|
2fd5815546 | ||
|
|
cba31b52b3 | ||
|
|
eadcb472e1 | ||
|
|
b3b6d9d77c | ||
|
|
48dcf7852e | ||
|
|
73a876a056 | ||
|
|
f50603a5fc | ||
|
|
164dcfe65b | ||
|
|
fb356b1344 | ||
|
|
a3d91ae318 | ||
|
|
65b4f58703 | ||
|
|
54551c7d6e | ||
|
|
d877e3fcac | ||
|
|
dbfe7dd42e | ||
|
|
45b4187596 | ||
|
|
44c63795a7 | ||
|
|
36244ac1ff | ||
|
|
d3790feac0 | ||
|
|
b63aca9a2c | ||
|
|
8f2f2a0d9d | ||
|
|
5d57ca10d9 | ||
|
|
a5913d98e1 | ||
|
|
5f3e3c2c62 | ||
|
|
c53e4c1d77 | ||
|
|
6d8be68071 | ||
|
|
fb28c99b8a | ||
|
|
acaed3deab | ||
|
|
bb47fdf25e | ||
|
|
97bb5b2b6d | ||
|
|
c0f0c67864 | ||
|
|
e91b0f0517 | ||
|
|
3f1f999e2d | ||
|
|
c63bc6bfaa | ||
|
|
a54907dce3 | ||
|
|
2c57c399bf | ||
|
|
a063580dbb | ||
|
|
a2c6e429b3 | ||
|
|
f3e07f105e | ||
|
|
f21700d876 | ||
|
|
34669aa651 | ||
|
|
08248f0859 | ||
|
|
722be83a14 | ||
|
|
ea1a6e814b | ||
|
|
2c930b19ba | ||
|
|
75e8eaad78 | ||
|
|
b74d6cfb98 | ||
|
|
a95d4ac1b5 | ||
|
|
b9c9d411ff | ||
|
|
05cc753275 | ||
|
|
af4a1c4e6b | ||
|
|
ef39098a1b | ||
|
|
6671b44434 | ||
|
|
b2dbde4b8c | ||
|
|
57cb36333b | ||
|
|
bfacc99ac3 | ||
|
|
e2192e119d | ||
|
|
4e0ac33eae | ||
|
|
8078e5bd54 | ||
|
|
146a0da7b3 | ||
|
|
ad7b83fc86 | ||
|
|
c668c49a15 | ||
|
|
3574346318 | ||
|
|
008be2848e | ||
|
|
63261593c8 | ||
|
|
18b14eb4a8 | ||
|
|
4724e503b0 | ||
|
|
2c4d93c7cf | ||
|
|
148c1c0984 | ||
|
|
6bc784b95a | ||
|
|
d275cce099 | ||
|
|
5136659a59 | ||
|
|
414816064f | ||
|
|
dcf96e43fa | ||
|
|
ea7d7bb644 | ||
|
|
60891cd197 | ||
|
|
0556fea593 | ||
|
|
74fcf6f28d | ||
|
|
70eb03ec29 | ||
|
|
856d26cb4b | ||
|
|
1adf386345 | ||
|
|
02137de419 | ||
|
|
73516df908 | ||
|
|
3025b9ebac | ||
|
|
e235f372ce | ||
|
|
62ace035c6 | ||
|
|
07a169d964 | ||
|
|
8e2b91c8cc | ||
|
|
831ff281d0 | ||
|
|
29ad485d17 | ||
|
|
51f740e23e | ||
|
|
c751f4a6ec | ||
|
|
742868dc2d | ||
|
|
9b8bddd179 | ||
|
|
1987203745 | ||
|
|
f7abcfb39a | ||
|
|
016bc8b813 | ||
|
|
66b1a59efe | ||
|
|
bd4750126b | ||
|
|
0fba6bd347 | ||
|
|
eb9db854d7 | ||
|
|
7d68d59cc2 | ||
|
|
f9311ba61d | ||
|
|
60d2888605 | ||
|
|
c2ada4c306 | ||
|
|
310ef194a1 | ||
|
|
daf30eff79 | ||
|
|
a90585f1d6 | ||
|
|
4be6d423e4 | ||
|
|
2db724bc50 | ||
|
|
452b9c26e4 | ||
|
|
d0c05b0143 | ||
|
|
36aeb4e9ee | ||
|
|
f8d4b66edd | ||
|
|
483de7d614 | ||
|
|
a95ed40bf0 | ||
|
|
686efcfcb1 | ||
|
|
bd6f2760a3 | ||
|
|
15631009b4 | ||
|
|
8eb822ebf3 | ||
|
|
aa95b1b763 | ||
|
|
92e3a5e386 | ||
|
|
4c22dcfbfd | ||
|
|
4f459198db | ||
|
|
056f7352ef | ||
|
|
0c2939b331 | ||
|
|
68e3d685fd | ||
|
|
0209d3f185 | ||
|
|
ef6890c31d | ||
|
|
1e98b3b559 | ||
|
|
223238d265 | ||
|
|
33f1f69e9c | ||
|
|
fb04f2723a | ||
|
|
78d4265f65 | ||
|
|
c2aed5345e | ||
|
|
2392894eb0 | ||
|
|
59fa2c0763 | ||
|
|
7081b2df85 | ||
|
|
1f34221552 | ||
|
|
c43681a068 | ||
|
|
992fab50ee | ||
|
|
15be89f89d | ||
|
|
d2902c8d3b | ||
|
|
8e51ec9ee4 | ||
|
|
7d82f203ee | ||
|
|
c07711de1d | ||
|
|
cb610d54b4 | ||
|
|
2f36da5201 | ||
|
|
954e3d2e71 | ||
|
|
830ae266c4 | ||
|
|
6eae751e70 | ||
|
|
f0e0c35f2b | ||
|
|
dc8253450d | ||
|
|
8d28d8cca0 | ||
|
|
274afc2c61 | ||
|
|
5717fe9ca8 | ||
|
|
b6b2c756c9 | ||
|
|
db57db52cf | ||
|
|
08fd4b69e8 | ||
|
|
24130c882d | ||
|
|
759f94e17a | ||
|
|
90c0525c7e | ||
|
|
5ac4918bdd | ||
|
|
3f9af9deb9 | ||
|
|
c6b0664f52 | ||
|
|
e36c0a418a | ||
|
|
efc8c61f75 | ||
|
|
44c690cd9a | ||
|
|
f84a88a824 | ||
|
|
c33ceddc26 | ||
|
|
6a750c7a50 | ||
|
|
f288c4fcef | ||
|
|
ee9e506af2 | ||
|
|
8a122a90fa | ||
|
|
45f141ce69 | ||
|
|
a9824dc6a3 | ||
|
|
84228eaeda | ||
|
|
c739407f92 | ||
|
|
578d495f91 | ||
|
|
bdd68116b7 | ||
|
|
c8508fabd0 | ||
|
|
36bc770ed4 | ||
|
|
5701e147ef | ||
|
|
5fc99f02cf | ||
|
|
411f540590 | ||
|
|
b2bd56a012 | ||
|
|
a3bf32fe87 | ||
|
|
9e93c984f7 | ||
|
|
d7ce9430ca | ||
|
|
0fb53623a5 | ||
|
|
9ad34243aa | ||
|
|
06f719e501 | ||
|
|
f439149cb3 | ||
|
|
32c0b283ef | ||
|
|
6e91297fa2 | ||
|
|
752ca15da4 | ||
|
|
e33cb8ae12 | ||
|
|
10bd7bab14 | ||
|
|
84f0ae00d2 | ||
|
|
e3f213305b | ||
|
|
d886cf40ef | ||
|
|
d572e3b1f9 | ||
|
|
816bd48c83 | ||
|
|
05563a7832 | ||
|
|
93e3044c6d | ||
|
|
6825e6c90a | ||
|
|
6401c5b4ee | ||
|
|
4471e5419d | ||
|
|
2b820c534d | ||
|
|
765993846d | ||
|
|
d9073bb033 | ||
|
|
efbff6a3d9 | ||
|
|
61abb4645c | ||
|
|
11d1b661db | ||
|
|
b95b766bc0 | ||
|
|
4094dc0c96 | ||
|
|
b7fffe8f7e | ||
|
|
a87e2bcdf1 | ||
|
|
6564241674 | ||
|
|
dc5b2a2ec0 | ||
|
|
924cc34647 | ||
|
|
507f96cdeb | ||
|
|
c07397695a |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -18,6 +18,7 @@ Makefile.in
|
||||
/aclocal.m4
|
||||
/autom4te.cache
|
||||
/compile
|
||||
/config.cache
|
||||
/config.guess
|
||||
/config.h
|
||||
/config.h.in
|
||||
@@ -45,4 +46,5 @@ Makefile.in
|
||||
/po/stamp-po
|
||||
|
||||
/shadow.spec
|
||||
/shadow-*.tar.*
|
||||
/libmisc/getdate.c
|
||||
|
||||
20
.travis.yml
Normal file
20
.travis.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
sudo: false
|
||||
|
||||
language: c
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
- clang
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- autopoint
|
||||
- xsltproc
|
||||
|
||||
script:
|
||||
- ./autogen.sh --without-selinux --disable-man
|
||||
- grep ENABLE_ config.status
|
||||
- make
|
||||
|
||||
# vim:et:ts=2:sw=2
|
||||
178
ChangeLog
178
ChangeLog
@@ -1,3 +1,181 @@
|
||||
2020-01-23 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* selinux: inclue stdio (Michael Vetter)
|
||||
* man: don't suggest making groupmems user-writeable (Michael Weiser)
|
||||
* Makefile: bail out on error in for loops (Wolfgang Bumiller)
|
||||
* Adding logging of SSH_ORIGINAL_COMMAND to nologin. (ed@s5h.net)
|
||||
* add new HOME_MODE login.defs option (Duncan Overbruck)
|
||||
* Add tty logging to useradd (ed@s5h.net)
|
||||
* Useradd: make non-executable shell check only a warning (Tomas Mraz)
|
||||
* Update Dutch translation (Frans-Spiesschaert)
|
||||
* user_busy: Do not mistake a regular user process for a namespaced one (Tomas Mraz)
|
||||
* Revert "Honor --sbindir and --bindir for binary installation" Patrick McLean)
|
||||
|
||||
2019-12-20 Dave Reisner <dreisner@archlinux.org>
|
||||
|
||||
* Do not auto-enable acct_tools_setuid just because
|
||||
pam is enabled. NOTE - any distros which are relying
|
||||
on this behavior will need to switch to configure
|
||||
--enable-account-tools-setuid
|
||||
|
||||
2019-12-01 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Release 4.8
|
||||
* Initial optional bcrypt support.
|
||||
* Make build/install of 'su' optional.
|
||||
* Fix for vipw not resuming correctly when suspended
|
||||
* Sync password field descriptions in manpages
|
||||
* Check for valid shell argument in useradd
|
||||
* Allow translation of new strings through POTFILES.in
|
||||
* Migrate to itstool for translations
|
||||
* Migrate to new SELinux api
|
||||
* Support --enable-vendordir
|
||||
* pwck: Only check homedir if set and not a system user
|
||||
* Support nonstandard usernames
|
||||
* sget{pw,gr}ent: check for data at EOL
|
||||
* Add YYY-MM-DD support in chage
|
||||
* Fix failing chmod calls for suidubins
|
||||
* Fix --sbindir and --bindir for binary installations
|
||||
* Fix LASTLOG_UID_MAX in login.defs
|
||||
* Fix configure error with dash
|
||||
|
||||
2019-06-13 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Release 4.7
|
||||
* Spawn: don't loop forever on ECHILD
|
||||
* Do not fail locking if there is a stale lockfile Tomas Mraz)
|
||||
* Use lckpwdf if prefix not set (Tomas Mraz)
|
||||
* Build: check correct DocBook version (Jan Tojnar)
|
||||
* Usermod: Print 'no changes' to stdout, not stderr (Serge Hallyn)
|
||||
* Add support for btrfs subvolumes for home (Adam Majer)
|
||||
* Fix chpasswd long line handling (Nathan Ruiz)
|
||||
* Use secure_getenv for gettime (Chris Lamb)
|
||||
* Make sp_lstchg reproducible (Chris Lamb)
|
||||
* Do not crash commonio_close if db file is not open (Tomas Mraz)
|
||||
* Don't flush nscd and sssd cache in read-only mode (Charlie Vuillemez)
|
||||
* French manpage update (Alban VIDAL)
|
||||
* Fix manpage defaults for SUB_UID/GID_COUNT (Tomas Mraz)
|
||||
* Sync po files from shadow.pot (Alban VIDAL)
|
||||
* Usermod: guard against unsafe chown of homedir contents (Tomas Mraz)
|
||||
* Add LASTLOG_UID_MAX to login.defs (Tomas Mraz)
|
||||
* new[ug]idmap file capabilities support (Giuseppe Scrivano and Christian Brauner)
|
||||
* Fix segfault in useradd (Tomas Mraz)
|
||||
* Coverity issues (Tomas Mraz)
|
||||
* Flush sssd caches (Jakub Hrozek)
|
||||
* Log UID in nologin (Vladimir Ivanov)
|
||||
* run pam_getenvlist after setup_env in su.c (Michael Vogt)
|
||||
* Support systems with only utmpx (A. Wilcox)
|
||||
* Fix unguarded ENABLE_SUBIDS code (Jan Chren (rindeal))
|
||||
* Update po/zh_CN translation (Lion Yang)
|
||||
* Create parent dirs for useradd -m (Michael Vetter)
|
||||
* Prevent usermod segv
|
||||
* Fix usermod crash (fariouche)
|
||||
|
||||
2018-04-29 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Release 4.6
|
||||
* Newgrp: avoid unnecessary lookups
|
||||
* Make language less binary
|
||||
* Add error when turning off man switch
|
||||
* Spelling fixes
|
||||
* Make userdel work with -R
|
||||
* newgidmap: enforce setgroups=deny if self-mapping a group
|
||||
* Norwegian bokmål translation
|
||||
* pwck: prevent crash by not passing O_CREAT
|
||||
* WITH_TCB fixes from Mandriva
|
||||
* Fix pwconv and grpconv entry skips
|
||||
* Fix -- slurping in su
|
||||
* add --prefix option
|
||||
|
||||
2017-07-16 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Import new Dutch translations.
|
||||
|
||||
2017-07-10 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Expand error codes for groupmod.
|
||||
|
||||
2017-05-17 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Release 4.5
|
||||
|
||||
2017-05-17 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Patch from Tobias Stoeckmann fixing regression in previous CVE fix
|
||||
preventing SIGTERM to su from being propagated to the job.
|
||||
* Patch from Chris Lamb making sp_lstchg shadow field reproducible.
|
||||
* Merge Russian translation updates from Yuri Kozlov
|
||||
* Fix missing close of subuid file on error
|
||||
|
||||
2017-02-23 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Merge patch by Tobias Stoeckmann <tobias@stoeckmann.org> to fix
|
||||
the equivalent of util-linux CVE-2017-2616.
|
||||
|
||||
2017-02-08 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Update Kazakh translations
|
||||
* Consult configuration before calculating subuids
|
||||
* Remove misplaced semicolon
|
||||
|
||||
2017-01-29 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Patch from Fedora to improve performance with SSSD, Winbind,
|
||||
or nss_ldap. (Tomas Mraz)
|
||||
* Make sure knowndef_table is NULL-terminated. (Bernhard Rosenkränzer)
|
||||
|
||||
2016-12-21 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Drop leading underscore from _COMMONIO_H and _SHADOWIO_H
|
||||
* Fix readability in usermod error messages.
|
||||
* Reset user in tallylog
|
||||
* Add audit support to su
|
||||
|
||||
2016-12-02 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* changes since 4.4
|
||||
- Use sizeof rather than hardcoding snprintf args
|
||||
- Fix useradd improper default loading
|
||||
- Update Vietnamese translations
|
||||
- Update Polish translations
|
||||
- Remove non-POSIX chmod option in Makefile
|
||||
- Fix suidubins assignments
|
||||
- Fix --add-subuids etc spelling in manpages
|
||||
- Audit homedir ownership change.
|
||||
- Print error on selinux file context update failure
|
||||
- Keep original file perms when creating a backup
|
||||
|
||||
* (henceforth we'll update Changelog with each commit
|
||||
and proper credit)
|
||||
|
||||
2016-12-02 Serge Hallyn <serge@hallyn.com>
|
||||
|
||||
* Changes since 4.2.1:
|
||||
- Documentation, error report and translations updates
|
||||
- Replace path_max with 32
|
||||
- User namespace support fixes/updates including:
|
||||
- Correct sanity checks in newXidmap
|
||||
- Fix building without subuid support
|
||||
- Add /etc/subuid support for UID matching
|
||||
- Support subuid for nonlocal users
|
||||
- Default to 65536 subuid allocations
|
||||
- Respect -r
|
||||
- Check for range overflows
|
||||
- Add tests from svn tree
|
||||
- Use AC_CHECK_SIZEOF for uid_t size checks
|
||||
- Accomodate missing /etc and login.defs
|
||||
- Support FORCE_SHADOW
|
||||
- Be more robust in hostile environment
|
||||
- Allow removing a primary group
|
||||
- Clear passwords on __pw_dup errors
|
||||
- Memory leak fix in commonio_update and get_map_ranges
|
||||
- Fix resource leak in syslog_sg
|
||||
- Fix user busy error at userdel
|
||||
- Support set/clear lastlog record via lastlog command
|
||||
- Add --no-create-home as longopt for -M
|
||||
- Fix signal races
|
||||
- Reduce syslog priority of common usage events
|
||||
|
||||
2013-08-25 Nicolas François <nicolas.francois@centraliens.net>
|
||||
|
||||
* src/vipw.c: After waitpid(), use errno only if waitpid returned
|
||||
|
||||
@@ -2,7 +2,5 @@
|
||||
|
||||
EXTRA_DIST = NEWS README TODO shadow.spec.in
|
||||
|
||||
AUTOMAKE_OPTIONS = 1.5 dist-bzip2 foreign
|
||||
|
||||
SUBDIRS = po man libmisc lib src \
|
||||
contrib doc etc
|
||||
|
||||
142
NEWS
142
NEWS
@@ -654,9 +654,9 @@ shadow-4.0.18.2 -> shadow-4.1.0 09-12-2007
|
||||
- Use MD5_CRYPT_ENAB, ENCRYPT_METHOD, SHA_CRYPT_MIN_ROUNDS, and
|
||||
SHA_CRYPT_MAX_ROUNDS to define the default encryption algorithm for the
|
||||
passwords.
|
||||
- chpaswd, chgpasswd, newusers: New options -c/--crypt-method and
|
||||
- chpasswd, chgpasswd, newusers: New options -c/--crypt-method and
|
||||
-s/--sha-rounds to supersede the system default encryption algorithm.
|
||||
- chpaswd, chgpasswd, newusers: DES is no more the default algorithm. They
|
||||
- chpasswd, chgpasswd, newusers: DES is no more the default algorithm. They
|
||||
will respect the system default configured in /etc/login.defs
|
||||
|
||||
*** documentation:
|
||||
@@ -701,14 +701,14 @@ shadow-4.0.17 -> shadow-4.0.18 01-08-2006
|
||||
- groupadd, groupmod, useradd, usermod: fixed UID/GID overflow (fixed
|
||||
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=198920)
|
||||
- passwd, useradd, usermod: fixed inactive/mindays/warndays/maxdays overflow
|
||||
(simillar to RH#198920),
|
||||
- groupmems: rewrited for use PAM and getopt_long() and now it is enabled
|
||||
(similar to RH#198920),
|
||||
- groupmems: rewritten for use PAM and getopt_long() and now it is enabled
|
||||
for build and install (patch by George Kraft <gk4@swbell.net>),
|
||||
- S/Key: removed assign getpass() to libshadow_getpass() on autoconf level
|
||||
(patch by Ulrich Mueller <ulm@kph.uni-mainz.de>; http://bugs.gentoo.org/139966),
|
||||
- usermod: back to previous -a option semantics and clarify -a behavior
|
||||
on documentation level (by Greg Schafer <gschafer@zip.com.au>),
|
||||
- chsh, groupmod: rewrited for use getopt_long().
|
||||
- chsh, groupmod: rewritten for use getopt_long().
|
||||
- updated translations: ca, cs, da, eu, fr, gl, hu, ko, pl, pt, ru, sv, tr, uk, vi.
|
||||
*** documentation:
|
||||
- fr and ru man pages are up to date,
|
||||
@@ -743,7 +743,7 @@ shadow-4.0.15 -> shadow-4.0.16 05-06-2006
|
||||
|
||||
*** general:
|
||||
- userdel: better fix for old CERT VU#312962 (which was fixed in shadow 4.0.8):
|
||||
fixed forgoten checking of the return value from fchown() before
|
||||
fixed forgotten checking of the return value from fchown() before
|
||||
proceeding with the fchmod() (based on Owl patch prepared by
|
||||
Rafal Wojtczuk <nergal@owl.openwall.com>),
|
||||
- userdel: use login.defs::MAIL_DIR instead hardcoded /var/mail in created
|
||||
@@ -755,7 +755,7 @@ shadow-4.0.15 -> shadow-4.0.16 05-06-2006
|
||||
passwords and libshadow_getpass() is used only because libc getpass()
|
||||
do not handles password prompting with echo enabled,
|
||||
- move login.defs::MD5_CRYPT_ENAB to non-PAM part,
|
||||
- userdel: rewrited for use getopt_log(),
|
||||
- userdel: rewritten for use getopt_log(),
|
||||
- install default/template configuration files:
|
||||
-- if shadow is configured with use PAM install /etc/pam.d/* files,
|
||||
-- if shadow do not uses PAM install /etc/{limits,login.acces} files,
|
||||
@@ -793,7 +793,7 @@ shadow-4.0.15 -> shadow-4.0.16 05-06-2006
|
||||
- updated ru login.defs(5), passwd(1), userdel(8), usermod(8) man pages,
|
||||
- pw_auth(3) man page removed (outdated),
|
||||
- install limits(5), login.access(5) and porttime(5) man pages only when
|
||||
shadow is builded with PAM support disabled,
|
||||
shadow is built with PAM support disabled,
|
||||
- passwd(1): better document how password strength is checked
|
||||
(fixed http://bugs.debian.org/115380),
|
||||
- usermod(8): added missing -a option description
|
||||
@@ -816,7 +816,7 @@ shadow-4.0.14 -> shadow-4.0.15 13-03-2006
|
||||
- login: default UMASK if not specified in login.defs is 022 (pointed by
|
||||
Peter Vrabec <pvrabec@redhat.com>),
|
||||
- chgpasswd: new tool (by Jonas Meurer <mejo@debian.org>),
|
||||
- lastlog: print the usage and exit if an additional argument is profided to
|
||||
- lastlog: print the usage and exit if an additional argument is provided to
|
||||
lastlog (merge 488_laslog_verify_arguments Debian patch),
|
||||
- login, newgrp, nologin, su: do not link with libselinux (merge
|
||||
490_link_selinux_only_when_needed Debian patch),
|
||||
@@ -830,9 +830,9 @@ shadow-4.0.14 -> shadow-4.0.15 13-03-2006
|
||||
tries exceeded,
|
||||
- always prints the number of tries in the syslog entry.
|
||||
- add special handling for PAM_ABORT
|
||||
- add an entry to failog, as when USE_PAM is not defined. (#53164)
|
||||
- add an entry to faillog, as when USE_PAM is not defined. (#53164)
|
||||
- changed pam_end to PAM_END. This is certainly was a mistake. PAM_END is
|
||||
pam_close_seesion + pam_end. Here, the session is still not open, we
|
||||
pam_close_session + pam_end. Here, the session is still not open, we
|
||||
don't have to close it.
|
||||
- a HAVE_PAM_FAIL_DELAY is missing,
|
||||
- su: fixed pam session support (patch from Topi Miettinen; fixed #57526,
|
||||
@@ -840,7 +840,7 @@ shadow-4.0.14 -> shadow-4.0.15 13-03-2006
|
||||
- userdel: user's group is already removed by update_groups().
|
||||
remove_group() is not needed (bug introduced in 4.0.14 on merge FC fixes).
|
||||
Fixed by Nicolas François <nicolas.francois@centraliens.net>,
|
||||
- useradd: allways remove group and gshadow databases lock, Fixed by Nicolas
|
||||
- useradd: always remove group and gshadow databases lock, Fixed by Nicolas
|
||||
François <nicolas.francois@centraliens.net>
|
||||
(http://bugs.debian.org/348250)
|
||||
- auditing fixes:
|
||||
@@ -848,14 +848,14 @@ shadow-4.0.14 -> shadow-4.0.15 13-03-2006
|
||||
added audit_logger() prototype),
|
||||
- useradd: fixed excess audit_logger() argument,
|
||||
- chage: added missing \n on display password status if password must be
|
||||
chaged,
|
||||
changed,
|
||||
- useradd: fixed allow non-unique UID (http://bugs.debian.org/351281),
|
||||
- variouse code cleanups for make possible compilation of shadow with -Wall
|
||||
- various code cleanups for make possible compilation of shadow with -Wall
|
||||
-Werror (by Alexander Gattin <xrgtn@yandex.ru>),
|
||||
- su: move exit() outside libmisc/shell.c::shell() for handle shell() errors
|
||||
on higher level (now is better visable where some programs exit with 126
|
||||
and 127 exit codes); added new shell() parameter (char *const envp[])
|
||||
which allow fix preserving enviloment in su on using -p, (patch by
|
||||
which allow fix preserving enviroment in su on using -p, (patch by
|
||||
Alexander Gattin <xrgtn@yandex.ru>),
|
||||
- su: added handle -c,--command option for GNU su compliance (merge
|
||||
437_su_-c_option Debian patch),
|
||||
@@ -903,7 +903,7 @@ shadow-4.0.13 -> shadow-4.0.14 03-01-2006
|
||||
- userdel: make the -f option force the removal of the user's group (even if it
|
||||
is the primary group of another user)
|
||||
(merge 453_userdel_-f_removes_group Debian patch),
|
||||
- usermod: rewrited for use getopt_long() (Christian Perrier <bubulle@kheops.frmug.org>),
|
||||
- usermod: rewritten for use getopt_long() (Christian Perrier <bubulle@kheops.frmug.org>),
|
||||
- grpck: fixed segmentation fault on using -s when /etc/gshadow is empty (fix by
|
||||
Tomasz Lemiech <szpajder@staszic.waw.pl>),
|
||||
- passwd: remove handle -f, -g and -s options.
|
||||
@@ -912,7 +912,7 @@ shadow-4.0.13 -> shadow-4.0.14 03-01-2006
|
||||
Nicolas François <nicolas.francois@centraliens.net>)
|
||||
- su: export $USER and $SHELL as well as $HOME (http://bugs.debian.org/11003 and
|
||||
http://bugs.debian.org/11189),
|
||||
- su, vipw: rewrited for use getopt_long(),
|
||||
- su, vipw: rewritten for use getopt_long(),
|
||||
- su: log successful/failed through syslog (http://bugs.debian.org/190215),
|
||||
- updated translations: ca, cs, da, eu, fi, fr, it, pl, pt, ru, sv, tl, vi,
|
||||
- new translations: gl.
|
||||
@@ -946,7 +946,7 @@ shadow-4.0.12 -> shadow-4.0.13 10-10-2005
|
||||
|
||||
*** general:
|
||||
- chage: removed duplicated pam_start(),
|
||||
- chfn, chsh: finished PAM support usin pam_start() and co.,
|
||||
- chfn, chsh: finished PAM support using pam_start() and co.,
|
||||
- userdel: userdel should not remove the group which is primary for someone else
|
||||
(fix by Nicolas François <nicolas.francois@centraliens.net>
|
||||
http://bugs.debian.org/295416),
|
||||
@@ -955,7 +955,7 @@ shadow-4.0.12 -> shadow-4.0.13 10-10-2005
|
||||
- fixedlib/commonio.c: don't assume selinux is enabled if is_selinux_enabled()
|
||||
returns -1 (merge isSelinuxEnabled FC patch by Jeremy Katz <katzj@redhat.com>),
|
||||
- login, su (non-PAM case): fixed setup max address space limits (added missing break
|
||||
statement in case) spoted by Lasse Collin <lasse.collin@tukaani.org>,
|
||||
statement in case) spotted by Lasse Collin <lasse.collin@tukaani.org>,
|
||||
- auditing support added. Patch prepared by Peter Vrabec <pvrabec@redhat.com> basing
|
||||
on work by Steve Grubb from http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=159215
|
||||
Now auditing support have commands: chage, gpasswd, groupadd, groupdel, groupmod,
|
||||
@@ -972,12 +972,12 @@ shadow-4.0.12 -> shadow-4.0.13 10-10-2005
|
||||
This will permit to adduser Debian script to detect if chage failed because the
|
||||
system doesn't have shadowed passwords (fix for http://bugs.debian.org/317012),
|
||||
- merge 010_more-i18ned-messages Debian patch which adds i18n support for few
|
||||
more messages (orginaly patch was prepared by Guillem Jover <guillem@debian.org>),
|
||||
more messages (originally patch was prepared by Guillem Jover <guillem@debian.org>),
|
||||
- lastlog: added handle -b option which allow print only lastlog records older than
|
||||
specified DAYS (fix by <miles@lubin.us>),
|
||||
- chpasswd, gpasswd, newusers: fixed libmisc/salt.c for use login.defs::MD5_CRYPT_ENAB
|
||||
only if PAM support is disabled (fix by John Gatewood Ham <zappaman@buraphalinux.org>),
|
||||
- passwd: rewrited for use getopt_long(),
|
||||
- passwd: rewritten for use getopt_long(),
|
||||
- newgrp: when newgrp process sits between parent and child shells, it should
|
||||
propagate STOPs from child to parent and CONTs from parent to child,
|
||||
otherwise e.g. bash's "suspend" command won't work
|
||||
@@ -987,11 +987,11 @@ shadow-4.0.12 -> shadow-4.0.13 10-10-2005
|
||||
- chsh(1), groupadd(8), newusers(8), pwconv(8), useradd(8), userdel(8), usermod(8):
|
||||
added missing references to /etc/login.defs and login.defs(5)
|
||||
(Christian Perrier <bubulle@kheops.frmug.org>),
|
||||
- passwd(5): rewrited based on work by Greg Wooledge <greg@wooledge.org>
|
||||
- passwd(5): rewritten based on work by Greg Wooledge <greg@wooledge.org>
|
||||
http://bugs.debian.org/328113
|
||||
- login(1): added securetty(5) to SEE ALSO section
|
||||
(fixed Debian bug http://bugs.debian.org/325773),
|
||||
- groupadd(8), useradd(8): fix regular expression describing alloved login/group
|
||||
- groupadd(8), useradd(8): fix regular expression describing allowed login/group
|
||||
names (pointed by Nicolas François <nicolas.francois@centraliens.net>)
|
||||
(correct is [a-z_][a-z0-9_-]*[$]),
|
||||
- groupadd(8), useradd(8): documents in CAVEATS section the limitations shadow
|
||||
@@ -1001,9 +1001,9 @@ shadow-4.0.12 -> shadow-4.0.13 10-10-2005
|
||||
shadow-4.0.11.1 -> shadow-4.0.12 22-08-2005
|
||||
|
||||
*** general:
|
||||
- newgrp, login: remove using login.defs::CLOSE_SESSIONS variable and allways
|
||||
- newgrp, login: remove using login.defs::CLOSE_SESSIONS variable and always
|
||||
close PAM session,
|
||||
- fixed configure.in: realy enable shadow group support by default (pointed by
|
||||
- fixed configure.in: really enable shadow group support by default (pointed by
|
||||
Greg Schafer <gschafer@zip.com.au> and Peter Vrabec <pvrabec@redhat.com>),
|
||||
- login.defs: removed handle QMAIL_DIR variable,
|
||||
- login: allow regular user to login on read-only root file system (not only for root)
|
||||
@@ -1028,9 +1028,9 @@ shadow-4.0.11.1 -> shadow-4.0.12 22-08-2005
|
||||
period and permit brute-force attacks (fixed http://bugs.debian.org/288827),
|
||||
- uClibc fixes (by Martin Schlemmer <azarah@nosferatu.za.org>):
|
||||
added require ngettext (added [need-ngettext] to AM_GNU_GETTEXT() parameters)
|
||||
and stub prototype for ngettext() in lib/prototypes.h (neccessary if shadow
|
||||
and stub prototype for ngettext() in lib/prototypes.h (necessary if shadow
|
||||
compiled with disabled NLS support)
|
||||
- groupadd: rewrited for use getopt_long(),
|
||||
- groupadd: rewritten for use getopt_long(),
|
||||
- groupadd, groupdel, groupmod, userdel: do OPENLOG() before pam_start(),
|
||||
- groupadd: fixed double OPENLOG(),
|
||||
- removed lib/{grpack,gspack,pwpack,sppack}.c and prototypes from lib/prototypes.h
|
||||
@@ -1066,7 +1066,7 @@ shadow-4.0.10 -> shadow-4.0.11 18-07-2005
|
||||
- su: ignore SIGINT while authenticating. A ^C could defeat the waiting period and
|
||||
permit brute-force attacks. Also ignore SIGQUIT.
|
||||
Fixed: http://bugs.debian.org/52372 and http://bugs.debian.org/288827
|
||||
- useradd: rewrited for use getopt_long(),
|
||||
- useradd: rewritten for use getopt_long(),
|
||||
- newgrp: add fix for handle splitted NIS groups: extends the functionality that,
|
||||
if the requested group is given, all groups of the same GID are tested for
|
||||
membership of the requesting user.
|
||||
@@ -1097,7 +1097,7 @@ shadow-4.0.10 -> shadow-4.0.11 18-07-2005
|
||||
- updated translations: cs, da, de, es, fi, pl, pt, ro, ru, sk.
|
||||
*** documentation:
|
||||
- pwck(8): document -q option (based on Debian patch for fix http://bugs.debian.org/309408)
|
||||
- pwck(8): rewrited OPTIONS section and better SYNOPSIS,
|
||||
- pwck(8): rewritten OPTIONS section and better SYNOPSIS,
|
||||
- lastlog(8): document that lastlog is a sparse file, and don't need to be rotated
|
||||
http://bugs.debian.org/219321
|
||||
- login(8): better explain the respective roles of login, init and getty with regards
|
||||
@@ -1111,12 +1111,12 @@ shadow-4.0.9 -> shadow-4.0.10 28-06-2005
|
||||
|
||||
*** general:
|
||||
- mkpasswd: removed,
|
||||
- userdel: now deletes user groups from /etc/gshdow as well as /etc/group.
|
||||
- userdel: now deletes user groups from /etc/gshadow as well as /etc/group.
|
||||
Fix by Nicolas François <nicolas.francois@centraliens.net>.
|
||||
http://bugs.debian.org/99442
|
||||
- usermod: when relocating a user's home directory, don't fail and remove the new
|
||||
home directory if we can't remove the old home directory for some
|
||||
reason; the results can be spectularly poort if, for instance, only
|
||||
reason; the results can be spectacularly poor if, for instance, only
|
||||
the rmdir() fails. Patch prepared by Timo Lindfors <lindi-spamtrap@newmail.com>.
|
||||
http://bugs.debian.org/166369
|
||||
- su: fix syslogs to be less ambiguous. Use old:new format instead of old-new
|
||||
@@ -1124,7 +1124,7 @@ shadow-4.0.9 -> shadow-4.0.10 28-06-2005
|
||||
http://bugs.debian.org/213592
|
||||
- removed not used now libmisc/setup.c,
|
||||
- login: use also UTMPX API instead UTMP on failure (login was affected for this
|
||||
when shadow was builded without PAM support)
|
||||
when shadow was built without PAM support)
|
||||
patch by Nicolas François <nicolas.francois@centraliens.net>
|
||||
- login: the PAM session needs to be closed as root, thus before change_uid()
|
||||
http://bugs.debian.org/53570 http://bugs.debian.org/195048 http://bugs.debian.org/211884
|
||||
@@ -1135,12 +1135,12 @@ shadow-4.0.9 -> shadow-4.0.10 28-06-2005
|
||||
http://bugs.debian.org/48002
|
||||
- login: fixed username on succesful login (was using the normal username,
|
||||
when it should have used pam_user) http://bugs.debian.org/47819
|
||||
- remove using SHADOWPWD #define so now shadow is allways builded with shadow
|
||||
passwowd support,
|
||||
- chage: rewrited for use getopt_long(),
|
||||
- remove using SHADOWPWD #define so now shadow is always built with shadow
|
||||
password support,
|
||||
- chage: rewritten for use getopt_long(),
|
||||
- updated translations: ca, cs, da, fi, pl, ru, zh_TW.
|
||||
*** documentation:
|
||||
- most of the man pages now are generated from XML files so in case submiting any
|
||||
- most of the man pages now are generated from XML files so in case submitting any
|
||||
chages to this resources please make diff to XML files,
|
||||
- chfn: give more details about the influence of login.defs on what's allowed to
|
||||
users.
|
||||
@@ -1148,7 +1148,7 @@ shadow-4.0.9 -> shadow-4.0.10 28-06-2005
|
||||
shadow-4.0.8 -> shadow-4.0.9 23-05-2005
|
||||
|
||||
*** general:
|
||||
- passwd: fixed segfault in non-PAM connfiguration
|
||||
- passwd: fixed segfault in non-PAM configuration
|
||||
(submited by Greg Schafer <gschafer@zip.com.au>),
|
||||
- newgrp: fixed NULL pointer dereference - getlogin() and ttyname() can
|
||||
return NULL which is not checked (http://bugs.debian.org/162303),
|
||||
@@ -1170,15 +1170,15 @@ shadow-4.0.7 -> shadow-4.0.8 26-04-2005
|
||||
- configure.in: add using AC_GNU_SOURCE macro for kill compilation warnings about
|
||||
implicit declaration of function `fseeko',
|
||||
- faillog: changed faillog record display format for allow fit in 80 columns all
|
||||
faillog atributies,
|
||||
faillog attributes,
|
||||
- removed NDBM code (unused),
|
||||
- fixed use of SU_WHEEL_ONLY in su. Now su realy is avalaible for wheel group
|
||||
- fixed use of SU_WHEEL_ONLY in su. Now su really is available for wheel group
|
||||
members. Thanks to Mike Frysinger <vapier@gentoo.org> for report:
|
||||
http://bugs.gentoo.org/show_bug.cgi?id=80345
|
||||
- drop never finished kerberos and des_rpc support (for kerberos support back firs
|
||||
must be prepared modularization),
|
||||
- fixed UTMP path detection (by Kelledin <kelledin@users.sf.net>),
|
||||
- useradd: rewrited group count to dynamic (by John Newbigin
|
||||
- useradd: rewritten group count to dynamic (by John Newbigin
|
||||
<jnewbigin@ict.swin.edu.au>),
|
||||
- login: fixed create lastlog entry fo users never loged in on non-PAM
|
||||
variant of login (fix by <oracular@ziplip.com>),
|
||||
@@ -1193,7 +1193,7 @@ shadow-4.0.7 -> shadow-4.0.8 26-04-2005
|
||||
fchmod() is executed. (Actually, we could also pass the final "mode" to
|
||||
the open() call and then save the consequent fchmod().)
|
||||
- SELinux changes: added changes in chage, chfn, chsh, passwd for allow
|
||||
construct more grained user password/accuunt properties on SELinux
|
||||
construct more grained user password/account properties on SELinux
|
||||
policies level. Patch originally based on RH changes (submited by Chris
|
||||
PeBenito <pebenito@gentoo.org>),
|
||||
- added SELinux changes: in libmisc/copydir.c (based on Fedora patch),
|
||||
@@ -1211,7 +1211,7 @@ shadow-4.0.7 -> shadow-4.0.8 26-04-2005
|
||||
- newgrp(1): fix #251926, #166173, #113191 Debian bugs: explain why editing /etc/group
|
||||
(without gshadow) doesn't permit to use newgrp,
|
||||
- newgrp(1): newgrp uses /bin/sh (not bash),
|
||||
- faillog(8): updated after rewrited faillog command for use getopt_long(),
|
||||
- faillog(8): updated after rewritten faillog command for use getopt_long(),
|
||||
- login(1): removed fragment about abilities pass enviroment variables in login prompt,
|
||||
- gshadow(5): new file (by Nicolas Nicolas François <nicolas.francois@centraliens.net>),
|
||||
- usermod(8): fixed #302388 Debian bug: added separated -o option description,
|
||||
@@ -1229,24 +1229,24 @@ shadow-4.0.6 -> shadow-4.0.7 26-01-2005
|
||||
-- use fseeko() instead fseek() and remove casting file offsets to unsigned
|
||||
long.
|
||||
- lastlog:
|
||||
-- rewrited source code using the same style as in chpasswd.c,
|
||||
-- open lastlog file after finish parse comman line optiomns
|
||||
(now --help otput can be displayd for users without lastlog
|
||||
-- rewritten source code using the same style as in chpasswd.c,
|
||||
-- open lastlog file after finish parse commandline options
|
||||
(now --help output can be displayed for users without lastlog
|
||||
file read permission),
|
||||
-- cleanups in lastlog(8) man page using the same style as in
|
||||
chpasswd(8).
|
||||
- chpasswd:
|
||||
-- switch chpasswd to use getopt_long() and adds a --md5 option
|
||||
(by Ian Gulliver <ian@penguinhosting.net>),
|
||||
-- rewrited chpasswd(8) man page.
|
||||
-- rewritten chpasswd(8) man page.
|
||||
|
||||
shadow-4.0.5 -> shadow-4.0.6 08-11-2004
|
||||
|
||||
- su: fixed adding of pam_env env variables to enviroment
|
||||
(Martin Schlemmer <azarah@nosferatu.za.org>),
|
||||
- autoconf: fixed filling MAIL_SPOOL_DIR and MAIL_SPOOL_FILE variables
|
||||
which was allways empty (Gregorio Guidi <g.guidi@sns.it>),
|
||||
- realuy closse security bug in libmisc/pwdcheck.c,
|
||||
which was always empty (Gregorio Guidi <g.guidi@sns.it>),
|
||||
- really close security bug in libmisc/pwdcheck.c,
|
||||
- added missing template/example PAM service config files for chfn, chsh and
|
||||
userdel,
|
||||
- do not translate variable names from /etc/default/useradd during
|
||||
@@ -1257,10 +1257,10 @@ shadow-4.0.4.1 -> shadow-4.0.5 27-10-2004
|
||||
- change libmisc to private static library,
|
||||
- added SELinux support (basing on patch from Gentoo),
|
||||
- chage: more verbose/human readable -l output. This output is much more
|
||||
beter for send directly via email for each users as message with account
|
||||
better for send directly via email for each users as message with account
|
||||
status (for example as message with warning about account/password expiration),
|
||||
- login: fixed handle -f option: now it works correctly without specify "-h
|
||||
<host>" if open login session localy is required (thanks for help
|
||||
<host>" if open login session locally is required (thanks for help
|
||||
investigate bug for Krzysztof Kotlenga),
|
||||
- userdel: when removing a user with userdel, userdel was always exits with 1 (fixed).
|
||||
Based on http://bugs.gentoo.org/show_bug.cgi?id=66687,
|
||||
@@ -1274,7 +1274,7 @@ shadow-4.0.4.1 -> shadow-4.0.5 27-10-2004
|
||||
makes httpd Option SymlinkIfOwnerMatch break for default weg pages
|
||||
including symlinks placed into /etc/skel/public_html for example.
|
||||
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=66819
|
||||
- su: add pam_open_session() support. If builded without PAM support
|
||||
- su: add pam_open_session() support. If built without PAM support
|
||||
propagate $DISPLAY and $XAUTHORITY enviroment variables.
|
||||
Based on http://www.gentoo.org/cgi-bin/viewcvs.cgi/sys-apps/shadow/files/shadow-4.0.4.1-su-pam_open_session.patch?rev=1.1
|
||||
- applied 036_pam_access_with_preauth.patch Debian patch submited by Bjorn
|
||||
@@ -1287,11 +1287,11 @@ shadow-4.0.4.1 -> shadow-4.0.5 27-10-2004
|
||||
Use constant strings rather than argv[0] for syslog ident in the user
|
||||
management commands,
|
||||
shadow-4.0.4.1-owl-tmp.diff:
|
||||
Remove using mktemp() if mkstemp() prototype not found (use allways mkstemp()),
|
||||
Remove using mktemp() if mkstemp() prototype not found (use always mkstemp()),
|
||||
shadow-4.0.4.1-owl-check-reads.diff:
|
||||
Add checking for read errors in commonio and vipw/vigr (not doing so could
|
||||
result in data loss when the records are written back),
|
||||
- fixed securirty bug in libmisc/pwdcheck.c which allow unauthorized
|
||||
- fixed security bug in libmisc/pwdcheck.c which allow unauthorized
|
||||
account properties modification.
|
||||
Affected tools: chfn and chsh.
|
||||
Bug was discovered by Martin Schulze <joey@infodrom.org>.
|
||||
@@ -1307,12 +1307,12 @@ shadow-4.0.4.1 -> shadow-4.0.5 27-10-2004
|
||||
|
||||
shadow-4.0.4 => shadow-4.0.4.1 14-01-2004
|
||||
- bug fixes in automake files for generate correct tar ball on "make dist":
|
||||
added mising "EXTRA_DIST = $(man_MANS)" in man/*/Makefile.am.
|
||||
added missing "EXTRA_DIST = $(man_MANS)" in man/*/Makefile.am.
|
||||
|
||||
shadow-4.0.3 => shadow-4.0.4 14-01-2004
|
||||
|
||||
*** general:
|
||||
- added missing information about -f options in groupadd usage mesage
|
||||
- added missing information about -f options in groupadd usage message
|
||||
(document this also in man page),
|
||||
- removed TCFS support (tcfs is dead),
|
||||
- convert all po/*.po files to utf-8,
|
||||
@@ -1320,7 +1320,7 @@ shadow-4.0.3 => shadow-4.0.4 14-01-2004
|
||||
per service flushing method instead HUPing nscd process),
|
||||
- removed old AUTH_METHODS dependent code,
|
||||
- chage: now all code depend on SHADOWPWD. If shadow will not be configured
|
||||
on autoconf level for using shadow possword chage is olny stub which
|
||||
on autoconf level for using shadow password chage is olny stub which
|
||||
informs "chage not configured for shadow password support."
|
||||
- dpasswd: removed,
|
||||
- login: remove handle login.defs::DIALUPS_CHECK_ENAB code,
|
||||
@@ -1328,7 +1328,7 @@ shadow-4.0.3 => shadow-4.0.4 14-01-2004
|
||||
- ALL tools, libraries: remove old SVR4, SVR4_SI86_EUA BSD_QUOTA and ATT_AGE
|
||||
dependent code,
|
||||
- ALL: ready for gettext 0.11.5, automake 1.7.4, autoconf 2.57,
|
||||
- logoutd, userd: handle also utmpx if avalaile,
|
||||
- logoutd, userd: handle also utmpx if available,
|
||||
- newgrp: fix for non-PAM version
|
||||
Use CLOSE_SESSIONS depending code only when USE_PAM.
|
||||
The problem was reported by Mattias Webjorn Eriksson using Slackware
|
||||
@@ -1356,7 +1356,7 @@ shadow-4.0.3 => shadow-4.0.4 14-01-2004
|
||||
|
||||
shadow-4.0.2 => shadow-4.0.3 13-03-2002
|
||||
|
||||
- added variouse cs, de, fr, id, it, ko man pages found mainly in national
|
||||
- added various cs, de, fr, id, it, ko man pages found mainly in national
|
||||
man pages translations projects (this documents are not synced with
|
||||
current en version but you know .. "Documentations is lik sex. When it is
|
||||
good it very very good. Whet it is bad it is better than nothing."). Any
|
||||
@@ -1372,9 +1372,9 @@ shadow-4.0.2 => shadow-4.0.3 13-03-2002
|
||||
shadow-4.0.1 => shadow-4.0.2 17-02-2002
|
||||
|
||||
- resolve many fuzzy translations also all this which may cause problems on
|
||||
displaing long uid/gid,
|
||||
- allow use "$" on ending in cereated by useradd usermname accounts for allow
|
||||
create machine acounts for samba (thanks to Jerome Borsboom
|
||||
displaying long uid/gid,
|
||||
- allow use "$" on ending in created by useradd username accounts for allow
|
||||
create machine accounts for samba (thanks to Jerome Borsboom
|
||||
<borsboom@tch.fgg.eur.nl> for point this problem in 4.0.1),
|
||||
- fix small but ugly bug in configure.in in libpam_mics library detection.
|
||||
|
||||
@@ -1394,7 +1394,7 @@ shadow-4.0.0 => shadow-4.0.1
|
||||
as root. If root does read-only, there's no lock needed. Added missing
|
||||
"#include <errno.h>" for above (me).
|
||||
shadow-4.0.0-owl-warnings.diff
|
||||
Olny one fix from this patch was aplayd because other was fixed few days
|
||||
Olny one fix from this patch was applied because other was fixed few days
|
||||
before :)
|
||||
shadow-4.0.0-owl-check_names.diff
|
||||
Merge only prat this patch with checking login name matching; checking
|
||||
@@ -1402,7 +1402,7 @@ shadow-4.0.0 => shadow-4.0.1
|
||||
probably _POSIX_LOGIN_NAME_MAX from <bits/posix1_lim.h>,
|
||||
shadow-4.0.0-owl-chage-drop-priv.diff
|
||||
shadow-4.0.0-owl-pam-auth.diff
|
||||
Merge part with reorder initialize PAM and checkin is chage is runed by
|
||||
Merge part with reorder initialize PAM and checking if chage is runed by
|
||||
root or not - now chage can be runed from non-root account for checking
|
||||
by user own account information (if PAM enabled).
|
||||
- fixes for handle/print correctly 32bit uid/gid (Thorsten Kukuk <kukuk@suse.de>),
|
||||
@@ -1446,30 +1446,30 @@ shadow-20001016 => shadow-4.0.0 06-01-2002
|
||||
- much better automake support,
|
||||
- added pt_BR man pages for gpasswd(1), groupadd(8), groupdel(8),
|
||||
groupmod(8), shadow(5) (man pages for other nations also are welcome),
|
||||
- mamny small fixes and updates nad improvements in man pages,
|
||||
- aplayed Debian patch to man pages for shadowconfig,
|
||||
- many small fixes and updates nad improvements in man pages,
|
||||
- applied Debian patch to man pages for shadowconfig,
|
||||
- remove limit to 6 chars logged tty name (012_libmisc_sulog.c.diff Debian
|
||||
patch).
|
||||
|
||||
shadow-20001012 -> shadow-20001016:
|
||||
- conditionaly disabled body reload_nscd() because not every
|
||||
- conditionally disabled body reload_nscd() because not every
|
||||
version of nscd can handle it (this can be enabled by define
|
||||
ENABLE_NSCD_SIGHUP) (Marek Michałkiewicz <marekm@linux.org.pl>)
|
||||
- fixes on autoconf/automake level for dist target,
|
||||
- Julianne F. Haugh new contact adress.
|
||||
- Julianne F. Haugh new contact address.
|
||||
|
||||
shadow-20000902 => shadow-20001012
|
||||
|
||||
- removed /redhat directory with obsoleted files (partialy rewrited spec
|
||||
- removed /redhat directory with obsoleted files (partially rewritten spec
|
||||
file is now in root directory),
|
||||
- aplayed shadow-19990827-group.patch patch from RH wich prevents adduser
|
||||
- applied shadow-19990827-group.patch patch from RH wich prevents adduser
|
||||
overwrite previously existing groups in adduser,
|
||||
- added PAM support for chage (bind to "chage" PAM config file) also
|
||||
added PAM support for all other small tools like chpasswd, groupadd,
|
||||
groupdel, groupmod, newusers, useradd, userdel, usermod (bind to common
|
||||
"shadow" PAM config file) - this modificaytions mainly based on
|
||||
"shadow" PAM config file) - this modifications mainly based on
|
||||
modifications prepared by Janek Rękojarski <baggins@pld.org.pl>,
|
||||
- many small fixes and improvments in automake (mow "make dist"
|
||||
- many small fixes and improvements in automake (mow "make dist"
|
||||
works correctly),
|
||||
- added cs translation (Jiri Pavlovsky <Jiri.Pavlovsky@ff.cuni.cz>).
|
||||
|
||||
|
||||
35
README
35
README
@@ -2,30 +2,25 @@ Shadow SITES
|
||||
============
|
||||
|
||||
Homepage
|
||||
http://pkg-shadow.alioth.debian.org/
|
||||
http://github.com/shadow-maint/shadow
|
||||
|
||||
FTP site
|
||||
ftp://pkg-shadow.alioth.debian.org/pub/pkg-shadow
|
||||
Issue tracker
|
||||
http://github.com/shadow-maint/shadow/issues
|
||||
|
||||
SVN repository
|
||||
anonymous read only access: svn://svn.debian.org/pkg-shadow/upstream
|
||||
|
||||
SVN web interface
|
||||
http://svn.debian.org/wsvn/pkg-shadow/upstream
|
||||
or
|
||||
http://svn.debian.org/viewsvn/pkg-shadow/upstream
|
||||
Releases
|
||||
https://github.com/shadow-maint/shadow/releases
|
||||
|
||||
Mailing lists
|
||||
for general discuss: pkg-shadow-devel@lists.alioth.debian.org
|
||||
commit list: pkg-shadow-commits@lists.alioth.debian.org
|
||||
for general discuss: pkg-shadow-devel@alioth-lists.debian.net
|
||||
commit list: pkg-shadow-commits@alioth-lists.debian.net
|
||||
|
||||
Mailing lists subscription
|
||||
http://lists.alioth.debian.org/mailman/listinfo/pkg-shadow-devel
|
||||
http://lists.alioth.debian.org/mailman/listinfo/pkg-shadow-commits
|
||||
http://alioth-lists.debian.net/mailman/listinfo/pkg-shadow-devel
|
||||
http://alioth-lists.debian.net/mailman/listinfo/pkg-shadow-commits
|
||||
|
||||
Mailing lists archives:
|
||||
http://lists.alioth.debian.org/pipermail/pkg-shadow-devel/
|
||||
http://lists.alioth.debian.org/pipermail/pkg-shadow-commits/
|
||||
http://alioth-lists.debian.net/pipermail/pkg-shadow-devel/
|
||||
http://alioth-lists.debian.net/pipermail/pkg-shadow-commits/
|
||||
|
||||
S/Key support:
|
||||
Shadow can be built with S/Key support using the S/Key package from:
|
||||
@@ -44,6 +39,7 @@ a lot of mail...
|
||||
|
||||
Adam Rudnicki <adam@v-lo.krakow.pl>
|
||||
Alan Curry <pacman@tardis.mars.net>
|
||||
Aleksa Sarai <cyphar@cyphar.com>
|
||||
Alexander O. Yuriev <alex@bach.cis.temple.edu>
|
||||
Algis Rudys <arudys@rice.edu>
|
||||
Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||
@@ -55,6 +51,7 @@ Brian R. Gaeke <brg@dgate.org>
|
||||
Calle Karlsson <ckn@kash.se>
|
||||
Chip Rosenthal <chip@unicom.com>
|
||||
Chris Evans <lady0110@sable.ox.ac.uk>
|
||||
Chris Lamb <chris@chris-lamb.co.uk>
|
||||
Cristian Gafton <gafton@sorosis.ro>
|
||||
Dan Walsh <dwalsh@redhat.com>
|
||||
Darcy Boese <possum@chardonnay.niagara.com>
|
||||
@@ -62,6 +59,7 @@ Dave Hagewood <admin@arrowweb.com>
|
||||
David A. Holland <dholland@hcs.harvard.edu>
|
||||
David Frey <David.Frey@lugs.ch>
|
||||
Ed Carp <ecarp@netcom.com>
|
||||
Eric W. Biederman" <ebiederm@xmission.com>
|
||||
Floody <flood@evcom.net>
|
||||
Frank Denis <j@4u.net>
|
||||
George Kraft IV <gk4@us.ibm.com>
|
||||
@@ -92,6 +90,7 @@ Martin Bene <mb@sime.com>
|
||||
Martin Mares <mj@gts.cz>
|
||||
Michael Meskes <meskes@topsystem.de>
|
||||
Michael Talbot-Wilson <mike@calypso.bns.com.au>
|
||||
Michael Vetter <jubalh@iodoru.org>
|
||||
Mike Frysinger <vapier@gentoo.org>
|
||||
Mike Pakovic <mpakovic@users.southeast.net>
|
||||
Nicolas François <nicolas.francois@centraliens.net>
|
||||
@@ -117,5 +116,7 @@ Maintainers
|
||||
===========
|
||||
|
||||
Tomasz Kłoczko <kloczek@pld.org.pl> (2000-2007)
|
||||
Nicolas François <nicolas.francois@centraliens.net> (2007-now)
|
||||
Nicolas François <nicolas.francois@centraliens.net> (2007-2014)
|
||||
Serge E. Hallyn <serge@hallyn.com> (2014-now)
|
||||
Christian Brauner <christian@brauner.io> (2019-now)
|
||||
|
||||
|
||||
100
configure.ac
100
configure.ac
@@ -1,6 +1,9 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT
|
||||
AM_INIT_AUTOMAKE(shadow, 4.4)
|
||||
AC_PREREQ([2.64])
|
||||
AC_INIT([shadow], [4.8.1], [pkg-shadow-devel@lists.alioth.debian.org], [],
|
||||
[https://github.com/shadow-maint/shadow])
|
||||
AM_INIT_AUTOMAKE([1.11 foreign dist-xz])
|
||||
AM_SILENT_RULES([yes])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
dnl Some hacks...
|
||||
@@ -31,7 +34,7 @@ AC_HEADER_STDBOOL
|
||||
|
||||
AC_CHECK_HEADERS(errno.h fcntl.h limits.h unistd.h sys/time.h utmp.h \
|
||||
utmpx.h termios.h termio.h sgtty.h sys/ioctl.h syslog.h paths.h \
|
||||
utime.h ulimit.h sys/resource.h gshadow.h lastlog.h \
|
||||
utime.h ulimit.h sys/capability.h sys/resource.h gshadow.h lastlog.h \
|
||||
locale.h rpc/key_prot.h netdb.h acl/libacl.h attr/libattr.h \
|
||||
attr/error_context.h)
|
||||
|
||||
@@ -71,12 +74,6 @@ AC_CHECK_MEMBERS([struct utmp.ut_type,
|
||||
struct utmp.ut_time,
|
||||
struct utmp.ut_xtime,
|
||||
struct utmp.ut_tv],,,[[#include <utmp.h>]])
|
||||
dnl There are dependencies:
|
||||
dnl If UTMPX has to be used, the utmp structure shall have a ut_id field.
|
||||
if test "$ac_cv_header_utmpx_h" = "yes" &&
|
||||
test "$ac_cv_member_struct_utmp_ut_id" != "yes"; then
|
||||
AC_MSG_ERROR(Systems with UTMPX and no ut_id field in the utmp structure are not supported)
|
||||
fi
|
||||
|
||||
AC_CHECK_MEMBERS([struct utmpx.ut_name,
|
||||
struct utmpx.ut_host,
|
||||
@@ -113,6 +110,9 @@ AC_REPLACE_FUNCS(sgetgrent sgetpwent sgetspent)
|
||||
AC_REPLACE_FUNCS(snprintf strcasecmp strdup strerror strstr)
|
||||
|
||||
AC_CHECK_FUNC(setpgrp)
|
||||
AC_CHECK_FUNC(secure_getenv, [AC_DEFINE(HAS_SECURE_GETENV,
|
||||
1,
|
||||
[Defined to 1 if you have the declaration of 'secure_getenv'])])
|
||||
|
||||
if test "$ac_cv_header_shadow_h" = "yes"; then
|
||||
AC_CACHE_CHECK(for working shadow group support,
|
||||
@@ -226,7 +226,7 @@ AC_ARG_ENABLE(account-tools-setuid,
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-account-tools-setuid)
|
||||
;;
|
||||
esac],
|
||||
[enable_acct_tools_setuid="maybe"]
|
||||
[enable_acct_tools_setuid="no"]
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE(utmpx,
|
||||
@@ -247,12 +247,15 @@ AC_ARG_ENABLE(subordinate-ids,
|
||||
[enable_subids="maybe"]
|
||||
)
|
||||
|
||||
AC_ARG_WITH(audit,
|
||||
AC_ARG_WITH(audit,
|
||||
[AC_HELP_STRING([--with-audit], [use auditing support @<:@default=yes if found@:>@])],
|
||||
[with_audit=$withval], [with_audit=maybe])
|
||||
AC_ARG_WITH(libpam,
|
||||
[AC_HELP_STRING([--with-libpam], [use libpam for PAM support @<:@default=yes if found@:>@])],
|
||||
[with_libpam=$withval], [with_libpam=maybe])
|
||||
AC_ARG_WITH(btrfs,
|
||||
[AC_HELP_STRING([--with-btrfs], [add BtrFS support @<:@default=yes if found@:>@])],
|
||||
[with_btrfs=$withval], [with_btrfs=maybe])
|
||||
AC_ARG_WITH(selinux,
|
||||
[AC_HELP_STRING([--with-selinux], [use SELinux support @<:@default=yes if found@:>@])],
|
||||
[with_selinux=$withval], [with_selinux=maybe])
|
||||
@@ -274,12 +277,21 @@ AC_ARG_WITH(libcrack,
|
||||
AC_ARG_WITH(sha-crypt,
|
||||
[AC_HELP_STRING([--with-sha-crypt], [allow the SHA256 and SHA512 password encryption algorithms @<:@default=yes@:>@])],
|
||||
[with_sha_crypt=$withval], [with_sha_crypt=yes])
|
||||
AC_ARG_WITH(bcrypt,
|
||||
[AC_HELP_STRING([--with-bcrypt], [allow the bcrypt password encryption algorithm @<:@default=no@:>@])],
|
||||
[with_bcrypt=$withval], [with_bcrypt=no])
|
||||
AC_ARG_WITH(nscd,
|
||||
[AC_HELP_STRING([--with-nscd], [enable support for nscd @<:@default=yes@:>@])],
|
||||
[with_nscd=$withval], [with_nscd=yes])
|
||||
AC_ARG_WITH(sssd,
|
||||
[AC_HELP_STRING([--with-sssd], [enable support for flushing sssd caches @<:@default=yes@:>@])],
|
||||
[with_sssd=$withval], [with_sssd=yes])
|
||||
AC_ARG_WITH(group-name-max-length,
|
||||
[AC_HELP_STRING([--with-group-name-max-length], [set max group name length @<:@default=16@:>@])],
|
||||
[with_group_name_max_length=$withval], [with_group_name_max_length=yes])
|
||||
AC_ARG_WITH(su,
|
||||
[AC_HELP_STRING([--with-su], [build and install su program and man page @<:@default=yes@:>@])],
|
||||
[with_su=$withval], [with_su=yes])
|
||||
|
||||
if test "$with_group_name_max_length" = "no" ; then
|
||||
with_group_name_max_length=0
|
||||
@@ -295,12 +307,26 @@ if test "$with_sha_crypt" = "yes"; then
|
||||
AC_DEFINE(USE_SHA_CRYPT, 1, [Define to allow the SHA256 and SHA512 password encryption algorithms])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(USE_BCRYPT, test "x$with_bcrypt" = "xyes")
|
||||
if test "$with_bcrypt" = "yes"; then
|
||||
AC_DEFINE(USE_BCRYPT, 1, [Define to allow the bcrypt password encryption algorithm])
|
||||
fi
|
||||
|
||||
if test "$with_nscd" = "yes"; then
|
||||
AC_CHECK_FUNC(posix_spawn,
|
||||
[AC_DEFINE(USE_NSCD, 1, [Define to support flushing of nscd caches])],
|
||||
[AC_MSG_ERROR([posix_spawn is needed for nscd support])])
|
||||
fi
|
||||
|
||||
if test "$with_sssd" = "yes"; then
|
||||
AC_CHECK_FUNC(posix_spawn,
|
||||
[AC_DEFINE(USE_SSSD, 1, [Define to support flushing of sssd caches])],
|
||||
[AC_MSG_ERROR([posix_spawn is needed for sssd support])])
|
||||
fi
|
||||
|
||||
AS_IF([test "$with_su" != "no"], AC_DEFINE(WITH_SU, 1, [Build with su])])
|
||||
AM_CONDITIONAL([WITH_SU], [test "x$with_su" != "xno"])
|
||||
|
||||
dnl Check for some functions in libc first, only if not found check for
|
||||
dnl other libraries. This should prevent linking libnsl if not really
|
||||
dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).
|
||||
@@ -309,6 +335,17 @@ AC_SEARCH_LIBS(inet_ntoa, inet)
|
||||
AC_SEARCH_LIBS(socket, socket)
|
||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||
|
||||
AC_CHECK_LIB([econf],[econf_readDirs],[LIBECONF="-leconf"],[LIBECONF=""])
|
||||
if test -n "$LIBECONF"; then
|
||||
ECONF_CPPFLAGS="-DUSE_ECONF=1"
|
||||
AC_ARG_ENABLE([vendordir],
|
||||
AS_HELP_STRING([--enable-vendordir=DIR], [Directory for distribution provided configuration files]),,[])
|
||||
fi
|
||||
AC_SUBST(ECONF_CPPFLAGS)
|
||||
AC_SUBST(LIBECONF)
|
||||
AC_SUBST([VENDORDIR], [$enable_vendordir])
|
||||
AM_CONDITIONAL([HAVE_VENDORDIR], [test "x$enable_vendordir" != x])
|
||||
|
||||
if test "$enable_shadowgrp" = "yes"; then
|
||||
AC_DEFINE(SHADOWGRP, 1, [Define to support the shadow group file.])
|
||||
fi
|
||||
@@ -321,11 +358,12 @@ if test "$enable_man" = "yes"; then
|
||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
||||
if test -z "$XSLTPROC"; then
|
||||
enable_man=no
|
||||
AC_MSG_ERROR([xsltproc is missing.])
|
||||
fi
|
||||
|
||||
dnl check for DocBook DTD and stylesheets in the local catalog.
|
||||
JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.1.2//EN],
|
||||
[DocBook XML DTD V4.1.2], [], enable_man=no)
|
||||
JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.5//EN],
|
||||
[DocBook XML DTD V4.5], [], enable_man=no)
|
||||
JH_CHECK_XML_CATALOG([http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl],
|
||||
[DocBook XSL Stylesheets >= 1.70.1], [], enable_man=no)
|
||||
fi
|
||||
@@ -449,6 +487,20 @@ if test "$with_libcrack" = "yes"; then
|
||||
AC_DEFINE(HAVE_LIBCRACK_PW, 1, [Defined if it includes *Pw functions.]))
|
||||
fi
|
||||
|
||||
if test "$with_btrfs" != "no"; then
|
||||
AC_CHECK_HEADERS([sys/statfs.h linux/magic.h linux/btrfs_tree.h], \
|
||||
[btrfs_headers="yes"], [btrfs_headers="no"])
|
||||
if test "$btrfs_headers$with_btrfs" = "noyes" ; then
|
||||
AC_MSG_ERROR([One of sys/statfs.h linux/magic.h linux/btrfs_tree.h is missing])
|
||||
fi
|
||||
|
||||
if test "$btrfs_headers" = "yes" ; then
|
||||
AC_DEFINE(WITH_BTRFS, 1, [Build shadow with BtrFS support])
|
||||
with_btrfs="yes"
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(WITH_BTRFS, test x$with_btrfs = xyes)
|
||||
|
||||
AC_SUBST(LIBSELINUX)
|
||||
AC_SUBST(LIBSEMANAGE)
|
||||
if test "$with_selinux" != "no"; then
|
||||
@@ -473,7 +525,7 @@ if test "$with_selinux" != "no"; then
|
||||
AC_MSG_ERROR([libsemanage not found])
|
||||
fi
|
||||
|
||||
if test "$selinux_lib$semanage_lib" == "yesyes" ; then
|
||||
if test "$selinux_lib$semanage_lib" = "yesyes" ; then
|
||||
AC_DEFINE(WITH_SELINUX, 1,
|
||||
[Build shadow with SELinux support])
|
||||
LIBSELINUX="-lselinux"
|
||||
@@ -563,7 +615,7 @@ if test "$with_libpam" = "yes"; then
|
||||
LIBS=$save_libs
|
||||
|
||||
AC_DEFINE(USE_PAM, 1, [Define to support Pluggable Authentication Modules])
|
||||
AC_DEFINE_UNQUOTED(SHADOW_PAM_CONVERSATION, [$pam_conv_function],[PAM converstation to use])
|
||||
AC_DEFINE_UNQUOTED(SHADOW_PAM_CONVERSATION, [$pam_conv_function],[PAM conversation to use])
|
||||
AM_CONDITIONAL(USE_PAM, [true])
|
||||
|
||||
AC_MSG_CHECKING(use login and su access checking if PAM not used)
|
||||
@@ -593,6 +645,19 @@ if test "$enable_acct_tools_setuid" != "no"; then
|
||||
fi
|
||||
AM_CONDITIONAL(ACCT_TOOLS_SETUID, test "x$enable_acct_tools_setuid" = "xyes")
|
||||
|
||||
|
||||
AC_ARG_WITH(fcaps,
|
||||
[AC_HELP_STRING([--with-fcaps], [use file capabilities instead of suid binaries for newuidmap/newgidmap @<:@default=no@:>@])],
|
||||
[with_fcaps=$withval], [with_fcaps=no])
|
||||
AM_CONDITIONAL(FCAPS, test "x$with_fcaps" = "xyes")
|
||||
|
||||
if test "x$with_fcaps" = "xyes"; then
|
||||
AC_CHECK_PROGS(capcmd, "setcap")
|
||||
if test "x$capcmd" = "x" ; then
|
||||
AC_MSG_ERROR([setcap command not available])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(LIBSKEY)
|
||||
AC_SUBST(LIBMD)
|
||||
if test "$with_skey" = "yes"; then
|
||||
@@ -668,12 +733,17 @@ if test "$with_libpam" = "yes"; then
|
||||
echo " suid account management tools: $enable_acct_tools_setuid"
|
||||
fi
|
||||
echo " SELinux support: $with_selinux"
|
||||
echo " BtrFS support: $with_btrfs"
|
||||
echo " ACL support: $with_acl"
|
||||
echo " Extended Attributes support: $with_attr"
|
||||
echo " tcb support (incomplete): $with_tcb"
|
||||
echo " shadow group support: $enable_shadowgrp"
|
||||
echo " S/Key support: $with_skey"
|
||||
echo " SHA passwords encryption: $with_sha_crypt"
|
||||
echo " bcrypt passwords encryption: $with_bcrypt"
|
||||
echo " nscd support: $with_nscd"
|
||||
echo " sssd support: $with_sssd"
|
||||
echo " subordinate IDs support: $enable_subids"
|
||||
echo " use file caps: $with_fcaps"
|
||||
echo " install su: $with_su"
|
||||
echo
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
** 1/28/95
|
||||
** shadow-adduser 1.3:
|
||||
**
|
||||
** Basically a bug-fix on my additions in 1.2. Thanx to Terry Stewart
|
||||
** Basically a bug-fix on my additions in 1.2. Thanks to Terry Stewart
|
||||
** (stew@texas.net) for pointing out one of the many idiotic bugs I introduced.
|
||||
** It was such a stupid bug that I would have never seen it myself.
|
||||
**
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
** 1/28/95
|
||||
** shadow-adduser 1.3:
|
||||
**
|
||||
** Basically a bug-fix on my additions in 1.2. Thanx to Terry Stewart
|
||||
** Basically a bug-fix on my additions in 1.2. Thanks to Terry Stewart
|
||||
** (stew@texas.net) for pointing out one of the many idiotic bugs I introduced.
|
||||
** It was such a stupid bug that I would have never seen it myself.
|
||||
**
|
||||
|
||||
@@ -32,7 +32,7 @@ def_home_dir=/home/users
|
||||
# default shell
|
||||
def_shell=/bin/tcsh
|
||||
|
||||
# Defaul expiration date (mm/dd/yy)
|
||||
# Default expiration date (mm/dd/yy)
|
||||
def_expire=""
|
||||
|
||||
# default dates
|
||||
|
||||
@@ -480,7 +480,7 @@ X.B groupmems
|
||||
\fB-D\fR |
|
||||
[\fB-g\fI group_name \fR]
|
||||
X.SH DESCRIPTION
|
||||
The \fBgroupmems\fR utility allows a user to administer his/her own
|
||||
The \fBgroupmems\fR utility allows a user to administer their own
|
||||
group membership list without the requirement of superuser privileges.
|
||||
The \fBgroupmems\fR utility is for systems that configure its users to
|
||||
be in their own name sake primary group (i.e., guest / guest).
|
||||
|
||||
@@ -2,7 +2,7 @@ Hello Marek,
|
||||
|
||||
I have created a diffile against the 980403 release that adds
|
||||
functionality to newusers for automatic handling of users with only
|
||||
anonomous ftp login (using the guestgroup feature in ftpaccess, which
|
||||
anonymous ftp login (using the guestgroup feature in ftpaccess, which
|
||||
means that the users home directory looks like '/home/user/./'). It also
|
||||
adds a commandline argument to specify an initial directory structure
|
||||
for such users, with a tarball normally containing the bin,lib,etc
|
||||
|
||||
@@ -15,7 +15,7 @@ Changes:
|
||||
- code merged into lmain.c --cristiang
|
||||
|
||||
TODO: - support groups in the limits file
|
||||
(only usernames are supported at this momment :-( )
|
||||
(only usernames are supported at this moment :-( )
|
||||
|
||||
Setting user limits for shadow login program
|
||||
|
||||
|
||||
15
docs/index.html
Normal file
15
docs/index.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<HEAD>
|
||||
<title>shadow - Welcome</title>
|
||||
</head>
|
||||
<body>
|
||||
<h2> Welcome!</h2>
|
||||
<p> This is the shadow tool suite home page. </p>
|
||||
|
||||
<p>
|
||||
You can find releases <a href="https://github.com/shadow-maint/shadow/releases">here</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Raise issues, request features, and report bugs <a href="https://github.com/shadow-maint/shadow/issues">here</a>.
|
||||
</p>
|
||||
</body>
|
||||
@@ -31,6 +31,15 @@ LOG_OK_LOGINS no
|
||||
#
|
||||
LASTLOG_ENAB yes
|
||||
|
||||
#
|
||||
# Limit the highest user ID number for which the lastlog entries should
|
||||
# be updated.
|
||||
#
|
||||
# No LASTLOG_UID_MAX means that there is no user ID limit for writing
|
||||
# lastlog entries.
|
||||
#
|
||||
#LASTLOG_UID_MAX
|
||||
|
||||
#
|
||||
# Enable checking and display of mailbox status upon login.
|
||||
#
|
||||
@@ -186,12 +195,17 @@ KILLCHAR 025
|
||||
# Default initial "umask" value used by login(1) on non-PAM enabled systems.
|
||||
# Default "umask" value for pam_umask(8) on PAM enabled systems.
|
||||
# UMASK is also used by useradd(8) and newusers(8) to set the mode for new
|
||||
# home directories.
|
||||
# home directories if HOME_MODE is not set.
|
||||
# 022 is the default value, but 027, or even 077, could be considered
|
||||
# for increased privacy. There is no One True Answer here: each sysadmin
|
||||
# must make up his/her mind.
|
||||
# must make up their mind.
|
||||
UMASK 022
|
||||
|
||||
# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new
|
||||
# home directories.
|
||||
# If HOME_MODE is not set, the value of UMASK is used to create the mode.
|
||||
#HOME_MODE 0700
|
||||
|
||||
#
|
||||
# Password aging controls:
|
||||
#
|
||||
@@ -311,6 +325,7 @@ CHFN_RESTRICT rwh
|
||||
# If set to MD5, MD5-based algorithm will be used for encrypting password
|
||||
# If set to SHA256, SHA256-based algorithm will be used for encrypting password
|
||||
# If set to SHA512, SHA512-based algorithm will be used for encrypting password
|
||||
# If set to BCRYPT, BCRYPT-based algorithm will be used for encrypting password
|
||||
# If set to DES, DES-based algorithm will be used for encrypting password (default)
|
||||
# Overrides the MD5_CRYPT_ENAB option
|
||||
#
|
||||
@@ -332,8 +347,23 @@ CHFN_RESTRICT rwh
|
||||
# If only one of the MIN or MAX values is set, then this value will be used.
|
||||
# If MIN > MAX, the highest value will be used.
|
||||
#
|
||||
# SHA_CRYPT_MIN_ROUNDS 5000
|
||||
# SHA_CRYPT_MAX_ROUNDS 5000
|
||||
#SHA_CRYPT_MIN_ROUNDS 5000
|
||||
#SHA_CRYPT_MAX_ROUNDS 5000
|
||||
|
||||
#
|
||||
# Only works if ENCRYPT_METHOD is set to BCRYPT.
|
||||
#
|
||||
# Define the number of BCRYPT rounds.
|
||||
# With a lot of rounds, it is more difficult to brute-force the password.
|
||||
# However, more CPU resources will be needed to authenticate users if
|
||||
# this value is increased.
|
||||
#
|
||||
# If not specified, 13 rounds will be attempted.
|
||||
# If only one of the MIN or MAX values is set, then this value will be used.
|
||||
# If MIN > MAX, the highest value will be used.
|
||||
#
|
||||
#BCRYPT_MIN_ROUNDS 13
|
||||
#BCRYPT_MAX_ROUNDS 13
|
||||
|
||||
#
|
||||
# List of groups to add to the user's supplementary group set
|
||||
|
||||
@@ -6,8 +6,7 @@ pamd_files = \
|
||||
chsh \
|
||||
groupmems \
|
||||
login \
|
||||
passwd \
|
||||
su
|
||||
passwd
|
||||
|
||||
pamd_acct_tools_files = \
|
||||
chage \
|
||||
@@ -29,4 +28,8 @@ pamd_DATA += $(pamd_acct_tools_files)
|
||||
endif
|
||||
endif
|
||||
|
||||
if WITH_SU
|
||||
pamd_files += su
|
||||
endif
|
||||
|
||||
EXTRA_DIST = $(pamd_files) $(pamd_acct_tools_files)
|
||||
|
||||
@@ -6,6 +6,10 @@ DEFS =
|
||||
noinst_LTLIBRARIES = libshadow.la
|
||||
|
||||
libshadow_la_LDFLAGS = -version-info 0:0:0
|
||||
libshadow_la_CPPFLAGS = $(ECONF_CPPFLAGS)
|
||||
if HAVE_VENDORDIR
|
||||
libshadow_la_CPPFLAGS += -DVENDORDIR=\"$(VENDORDIR)\"
|
||||
endif
|
||||
|
||||
libshadow_la_SOURCES = \
|
||||
commonio.c \
|
||||
@@ -30,6 +34,8 @@ libshadow_la_SOURCES = \
|
||||
lockpw.c \
|
||||
nscd.c \
|
||||
nscd.h \
|
||||
sssd.c \
|
||||
sssd.h \
|
||||
pam_defs.h \
|
||||
port.c \
|
||||
port.h \
|
||||
|
||||
104
lib/commonio.c
104
lib/commonio.c
@@ -45,6 +45,7 @@
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include "nscd.h"
|
||||
#include "sssd.h"
|
||||
#ifdef WITH_TCB
|
||||
#include <tcb.h>
|
||||
#endif /* WITH_TCB */
|
||||
@@ -140,7 +141,7 @@ static int do_lock_file (const char *file, const char *lock, bool log)
|
||||
int retval;
|
||||
char buf[32];
|
||||
|
||||
fd = open (file, O_CREAT | O_EXCL | O_WRONLY, 0600);
|
||||
fd = open (file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||
if (-1 == fd) {
|
||||
if (log) {
|
||||
(void) fprintf (stderr,
|
||||
@@ -301,15 +302,12 @@ static int create_backup (const char *backup, FILE * fp)
|
||||
struct utimbuf ub;
|
||||
FILE *bkfp;
|
||||
int c;
|
||||
mode_t mask;
|
||||
|
||||
if (fstat (fileno (fp), &sb) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
mask = umask (077);
|
||||
bkfp = fopen (backup, "w");
|
||||
(void) umask (mask);
|
||||
bkfp = fopen_set_perms (backup, "w", &sb);
|
||||
if (NULL == bkfp) {
|
||||
return -1;
|
||||
}
|
||||
@@ -366,6 +364,7 @@ static void free_linked_list (struct commonio_db *db)
|
||||
int commonio_setname (struct commonio_db *db, const char *name)
|
||||
{
|
||||
snprintf (db->filename, sizeof (db->filename), "%s", name);
|
||||
db->setname = true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -378,57 +377,77 @@ bool commonio_present (const struct commonio_db *db)
|
||||
|
||||
int commonio_lock_nowait (struct commonio_db *db, bool log)
|
||||
{
|
||||
char file[1024];
|
||||
char lock[1024];
|
||||
char* file = NULL;
|
||||
char* lock = NULL;
|
||||
size_t lock_file_len;
|
||||
size_t file_len;
|
||||
int err = 0;
|
||||
|
||||
if (db->locked) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
snprintf (file, sizeof file, "%s.%lu",
|
||||
file_len = strlen(db->filename) + 11;/* %lu max size */
|
||||
lock_file_len = strlen(db->filename) + 6; /* sizeof ".lock" */
|
||||
file = (char*)malloc(file_len);
|
||||
if(file == NULL) {
|
||||
goto cleanup_ENOMEM;
|
||||
}
|
||||
lock = (char*)malloc(lock_file_len);
|
||||
if(lock == NULL) {
|
||||
goto cleanup_ENOMEM;
|
||||
}
|
||||
snprintf (file, file_len, "%s.%lu",
|
||||
db->filename, (unsigned long) getpid ());
|
||||
snprintf (lock, sizeof lock, "%s.lock", db->filename);
|
||||
snprintf (lock, lock_file_len, "%s.lock", db->filename);
|
||||
if (do_lock_file (file, lock, log) != 0) {
|
||||
db->locked = true;
|
||||
lock_count++;
|
||||
return 1;
|
||||
err = 1;
|
||||
}
|
||||
return 0;
|
||||
cleanup_ENOMEM:
|
||||
if(file)
|
||||
free(file);
|
||||
if(lock)
|
||||
free(lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int commonio_lock (struct commonio_db *db)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifdef HAVE_LCKPWDF
|
||||
/*
|
||||
* only if the system libc has a real lckpwdf() - the one from
|
||||
* Only if the system libc has a real lckpwdf() - the one from
|
||||
* lockpw.c calls us and would cause infinite recursion!
|
||||
* It is also not used with the prefix option.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Call lckpwdf() on the first lock.
|
||||
* If it succeeds, call *_lock() only once
|
||||
* (no retries, it should always succeed).
|
||||
*/
|
||||
if (0 == lock_count) {
|
||||
if (lckpwdf () == -1) {
|
||||
if (geteuid () != 0) {
|
||||
(void) fprintf (stderr,
|
||||
"%s: Permission denied.\n",
|
||||
Prog);
|
||||
if (!db->setname) {
|
||||
/*
|
||||
* Call lckpwdf() on the first lock.
|
||||
* If it succeeds, call *_lock() only once
|
||||
* (no retries, it should always succeed).
|
||||
*/
|
||||
if (0 == lock_count) {
|
||||
if (lckpwdf () == -1) {
|
||||
if (geteuid () != 0) {
|
||||
(void) fprintf (stderr,
|
||||
"%s: Permission denied.\n",
|
||||
Prog);
|
||||
}
|
||||
return 0; /* failure */
|
||||
}
|
||||
return 0; /* failure */
|
||||
}
|
||||
}
|
||||
|
||||
if (commonio_lock_nowait (db, true) != 0) {
|
||||
return 1; /* success */
|
||||
}
|
||||
if (commonio_lock_nowait (db, true) != 0) {
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
ulckpwdf ();
|
||||
return 0; /* failure */
|
||||
#else /* !HAVE_LCKPWDF */
|
||||
int i;
|
||||
ulckpwdf ();
|
||||
return 0; /* failure */
|
||||
}
|
||||
#endif /* !HAVE_LCKPWDF */
|
||||
|
||||
/*
|
||||
* lckpwdf() not used - do it the old way.
|
||||
@@ -455,7 +474,6 @@ int commonio_lock (struct commonio_db *db)
|
||||
}
|
||||
}
|
||||
return 0; /* failure */
|
||||
#endif /* !HAVE_LCKPWDF */
|
||||
}
|
||||
|
||||
static void dec_lock_count (void)
|
||||
@@ -468,6 +486,7 @@ static void dec_lock_count (void)
|
||||
if (nscd_need_reload) {
|
||||
nscd_flush_cache ("passwd");
|
||||
nscd_flush_cache ("group");
|
||||
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
|
||||
nscd_need_reload = false;
|
||||
}
|
||||
#ifdef HAVE_LCKPWDF
|
||||
@@ -754,16 +773,16 @@ commonio_sort (struct commonio_db *db, int (*cmp) (const void *, const void *))
|
||||
for (ptr = db->head;
|
||||
(NULL != ptr)
|
||||
#if KEEP_NIS_AT_END
|
||||
&& (NULL != ptr->line)
|
||||
&& ( ('+' != ptr->line[0])
|
||||
&& ('-' != ptr->line[0]))
|
||||
&& ((NULL == ptr->line)
|
||||
|| (('+' != ptr->line[0])
|
||||
&& ('-' != ptr->line[0])))
|
||||
#endif
|
||||
;
|
||||
ptr = ptr->next) {
|
||||
n++;
|
||||
}
|
||||
#if KEEP_NIS_AT_END
|
||||
if ((NULL != ptr) && (NULL != ptr->line)) {
|
||||
if (NULL != ptr) {
|
||||
nis = ptr;
|
||||
}
|
||||
#endif
|
||||
@@ -908,7 +927,6 @@ static int write_all (const struct commonio_db *db)
|
||||
|
||||
|
||||
int commonio_close (struct commonio_db *db)
|
||||
/*@requires notnull db->fp@*/
|
||||
{
|
||||
char buf[1024];
|
||||
int errors = 0;
|
||||
@@ -921,8 +939,10 @@ int commonio_close (struct commonio_db *db)
|
||||
db->isopen = false;
|
||||
|
||||
if (!db->changed || db->readonly) {
|
||||
(void) fclose (db->fp);
|
||||
db->fp = NULL;
|
||||
if (NULL != db->fp) {
|
||||
(void) fclose (db->fp);
|
||||
db->fp = NULL;
|
||||
}
|
||||
goto success;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
#ifndef _COMMONIO_H
|
||||
#define _COMMONIO_H
|
||||
#ifndef COMMONIO_H
|
||||
#define COMMONIO_H
|
||||
|
||||
#ifdef WITH_SELINUX
|
||||
#include <selinux/selinux.h>
|
||||
@@ -143,6 +143,7 @@ struct commonio_db {
|
||||
bool isopen:1;
|
||||
bool locked:1;
|
||||
bool readonly:1;
|
||||
bool setname:1;
|
||||
};
|
||||
|
||||
extern int commonio_setname (struct commonio_db *, const char *);
|
||||
|
||||
@@ -24,7 +24,7 @@ typedef unsigned char _Bool;
|
||||
|
||||
/* Take care of NLS matters. */
|
||||
#ifdef S_SPLINT_S
|
||||
extern char *setlocale(int categorie, const char *locale);
|
||||
extern char *setlocale(int categories, const char *locale);
|
||||
# define LC_ALL (6)
|
||||
extern char * bindtextdomain (const char * domainname, const char * dirname);
|
||||
extern char * textdomain (const char * domainname);
|
||||
@@ -382,4 +382,10 @@ extern char *strerror ();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SECURE_GETENV
|
||||
# define shadow_getenv(name) secure_getenv(name)
|
||||
# else
|
||||
# define shadow_getenv(name) getenv(name)
|
||||
#endif
|
||||
|
||||
#endif /* _DEFINES_H_ */
|
||||
|
||||
@@ -65,6 +65,9 @@
|
||||
case '1':
|
||||
method = "MD5";
|
||||
break;
|
||||
case '2':
|
||||
method = "BCRYPT";
|
||||
break;
|
||||
case '5':
|
||||
method = "SHA256";
|
||||
break;
|
||||
|
||||
96
lib/getdef.c
96
lib/getdef.c
@@ -40,6 +40,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#ifdef USE_ECONF
|
||||
#include <libeconf.h>
|
||||
#endif
|
||||
#include "getdef.h"
|
||||
/*
|
||||
* A configuration item definition.
|
||||
@@ -90,8 +93,10 @@ static struct itemdef def_table[] = {
|
||||
{"FAKE_SHELL", NULL},
|
||||
{"GID_MAX", NULL},
|
||||
{"GID_MIN", NULL},
|
||||
{"HOME_MODE", NULL},
|
||||
{"HUSHLOGIN_FILE", NULL},
|
||||
{"KILLCHAR", NULL},
|
||||
{"LASTLOG_UID_MAX", NULL},
|
||||
{"LOGIN_RETRIES", NULL},
|
||||
{"LOGIN_TIMEOUT", NULL},
|
||||
{"LOG_OK_LOGINS", NULL},
|
||||
@@ -106,6 +111,10 @@ static struct itemdef def_table[] = {
|
||||
#ifdef USE_SHA_CRYPT
|
||||
{"SHA_CRYPT_MAX_ROUNDS", NULL},
|
||||
{"SHA_CRYPT_MIN_ROUNDS", NULL},
|
||||
#endif
|
||||
#ifdef USE_BCRYPT
|
||||
{"BCRYPT_MAX_ROUNDS", NULL},
|
||||
{"BCRYPT_MIN_ROUNDS", NULL},
|
||||
#endif
|
||||
{"SUB_GID_COUNT", NULL},
|
||||
{"SUB_GID_MAX", NULL},
|
||||
@@ -148,13 +157,23 @@ static struct itemdef knowndef_table[] = {
|
||||
#ifdef USE_PAM
|
||||
PAMDEFS
|
||||
#endif
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
#ifdef USE_ECONF
|
||||
#ifdef VENDORDIR
|
||||
static const char* vendordir = VENDORDIR;
|
||||
#else
|
||||
static const char* vendordir = NULL;
|
||||
#endif
|
||||
static const char* sysconfdir = "/etc";
|
||||
#else
|
||||
#ifndef LOGINDEFS
|
||||
#define LOGINDEFS "/etc/login.defs"
|
||||
#endif
|
||||
|
||||
static char def_fname[] = LOGINDEFS; /* login config defs file */
|
||||
static const char* def_fname = LOGINDEFS; /* login config defs file */
|
||||
#endif
|
||||
static bool def_loaded = false; /* are defs already loaded? */
|
||||
|
||||
/* local function prototypes */
|
||||
@@ -423,6 +442,37 @@ out:
|
||||
return (struct itemdef *) NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* setdef_config_file - set the default configuration file path
|
||||
*
|
||||
* must be called prior to any def* calls.
|
||||
*/
|
||||
|
||||
void setdef_config_file (const char* file)
|
||||
{
|
||||
#ifdef USE_ECONF
|
||||
size_t len;
|
||||
char* cp;
|
||||
|
||||
len = strlen(file) + strlen(sysconfdir) + 2;
|
||||
cp = malloc(len);
|
||||
if (cp == NULL)
|
||||
exit (13);
|
||||
snprintf(cp, len, "%s/%s", file, sysconfdir);
|
||||
sysconfdir = cp;
|
||||
#ifdef VENDORDIR
|
||||
len = strlen(file) + strlen(vendordir) + 2;
|
||||
cp = malloc(len);
|
||||
if (cp == NULL)
|
||||
exit (13);
|
||||
snprintf(cp, len, "%s/%s", file, vendordir);
|
||||
vendordir = cp;
|
||||
#endif
|
||||
#else
|
||||
def_fname = file;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* def_load - load configuration table
|
||||
*
|
||||
@@ -431,9 +481,16 @@ out:
|
||||
|
||||
static void def_load (void)
|
||||
{
|
||||
#ifdef USE_ECONF
|
||||
econf_file *defs_file = NULL;
|
||||
econf_err error;
|
||||
char **keys;
|
||||
size_t key_number;
|
||||
#else
|
||||
int i;
|
||||
FILE *fp;
|
||||
char buf[1024], *name, *value, *s;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set the initialized flag.
|
||||
@@ -441,6 +498,42 @@ static void def_load (void)
|
||||
*/
|
||||
def_loaded = true;
|
||||
|
||||
#ifdef USE_ECONF
|
||||
|
||||
error = econf_readDirs (&defs_file, vendordir, sysconfdir, "login", "defs", " \t", "#");
|
||||
if (error) {
|
||||
if (error == ECONF_NOFILE)
|
||||
return;
|
||||
|
||||
SYSLOG ((LOG_CRIT, "cannot open login definitions [%s]",
|
||||
econf_errString(error)));
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if ((error = econf_getKeys(defs_file, NULL, &key_number, &keys))) {
|
||||
SYSLOG ((LOG_CRIT, "cannot read login definitions [%s]",
|
||||
econf_errString(error)));
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < key_number; i++) {
|
||||
char *value;
|
||||
|
||||
econf_getStringValue(defs_file, NULL, keys[i], &value);
|
||||
|
||||
/*
|
||||
* Store the value in def_table.
|
||||
*
|
||||
* Ignore failures to load the login.defs file.
|
||||
* The error was already reported to the user and to
|
||||
* syslog. The tools will just use their default values.
|
||||
*/
|
||||
(void)putdef_str (keys[i], value);
|
||||
}
|
||||
|
||||
econf_free (keys);
|
||||
econf_free (defs_file);
|
||||
#else
|
||||
/*
|
||||
* Open the configuration definitions file.
|
||||
*/
|
||||
@@ -504,6 +597,7 @@ static void def_load (void)
|
||||
}
|
||||
|
||||
(void) fclose (fp);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ extern unsigned long getdef_ulong (const char *, unsigned long);
|
||||
extern unsigned int getdef_unum (const char *, unsigned int);
|
||||
extern /*@observer@*/ /*@null@*/const char *getdef_str (const char *);
|
||||
extern int putdef_str (const char *, const char *);
|
||||
extern void setdef_config_file (const char* file);
|
||||
|
||||
/* default UMASK value if not specified in /etc/login.defs */
|
||||
#define GETDEF_DEFAULT_UMASK 022
|
||||
|
||||
@@ -139,7 +139,8 @@ static /*@owned@*/struct commonio_db group_db = {
|
||||
false, /* changed */
|
||||
false, /* isopen */
|
||||
false, /* locked */
|
||||
false /* readonly */
|
||||
false, /* readonly */
|
||||
false /* setname */
|
||||
};
|
||||
|
||||
int gr_setdbname (const char *filename)
|
||||
@@ -338,8 +339,7 @@ static /*@null@*/struct commonio_entry *merge_group_entries (
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
snprintf(new_line, new_line_len, "%s\n%s", gr1->line, gr2->line);
|
||||
new_line[new_line_len] = '\0';
|
||||
snprintf(new_line, new_line_len + 1, "%s\n%s", gr1->line, gr2->line);
|
||||
|
||||
/* Concatenate the 2 list of members */
|
||||
for (i=0; NULL != gptr1->gr_mem[i]; i++);
|
||||
|
||||
@@ -72,6 +72,14 @@ extern int expire (const struct passwd *, /*@null@*/const struct spwd *);
|
||||
/* isexpired.c */
|
||||
extern int isexpired (const struct passwd *, /*@null@*/const struct spwd *);
|
||||
|
||||
/* btrfs.c */
|
||||
#ifdef WITH_BTRFS
|
||||
extern int btrfs_create_subvolume(const char *path);
|
||||
extern int btrfs_remove_subvolume(const char *path);
|
||||
extern int btrfs_is_subvolume(const char *path);
|
||||
extern int is_btrfs(const char *path);
|
||||
#endif
|
||||
|
||||
/* basename() renamed to Basename() to avoid libc name space confusion */
|
||||
/* basename.c */
|
||||
extern /*@observer@*/const char *Basename (const char *str);
|
||||
@@ -179,6 +187,9 @@ extern int getrange (char *range,
|
||||
unsigned long *min, bool *has_min,
|
||||
unsigned long *max, bool *has_max);
|
||||
|
||||
/* gettime.c */
|
||||
extern time_t gettime ();
|
||||
|
||||
/* get_uid.c */
|
||||
extern int get_uid (const char *uidstr, uid_t *uid);
|
||||
|
||||
@@ -251,9 +262,9 @@ extern void motd (void);
|
||||
/* myname.c */
|
||||
extern /*@null@*//*@only@*/struct passwd *get_my_pwent (void);
|
||||
|
||||
/* pam_pass_non_interractive.c */
|
||||
/* pam_pass_non_interactive.c */
|
||||
#ifdef USE_PAM
|
||||
extern int do_pam_passwd_non_interractive (const char *pam_service,
|
||||
extern int do_pam_passwd_non_interactive (const char *pam_service,
|
||||
const char *username,
|
||||
const char* password);
|
||||
#endif /* USE_PAM */
|
||||
@@ -271,6 +282,21 @@ extern void do_pam_passwd (const char *user, bool silent, bool change_expired);
|
||||
/* port.c */
|
||||
extern bool isttytime (const char *, const char *, time_t);
|
||||
|
||||
/* prefix_flag.c */
|
||||
extern const char* process_prefix_flag (const char* short_opt, int argc, char **argv);
|
||||
extern struct group *prefix_getgrnam(const char *name);
|
||||
extern struct group *prefix_getgrgid(gid_t gid);
|
||||
extern struct passwd *prefix_getpwuid(uid_t uid);
|
||||
extern struct passwd *prefix_getpwnam(const char* name);
|
||||
extern struct spwd *prefix_getspnam(const char* name);
|
||||
extern struct group *prefix_getgr_nam_gid(const char *grname);
|
||||
extern void prefix_setpwent();
|
||||
extern struct passwd* prefix_getpwent();
|
||||
extern void prefix_endpwent();
|
||||
extern void prefix_setgrent();
|
||||
extern struct group* prefix_getgrent();
|
||||
extern void prefix_endgrent();
|
||||
|
||||
/* pwd2spwd.c */
|
||||
#ifndef USE_PAM
|
||||
extern struct spwd *pwd_to_spwd (const struct passwd *);
|
||||
@@ -310,6 +336,7 @@ extern /*@observer@*/const char *crypt_make_salt (/*@null@*//*@observer@*/const
|
||||
#ifdef WITH_SELINUX
|
||||
extern int set_selinux_file_context (const char *dst_name);
|
||||
extern int reset_selinux_file_context (void);
|
||||
extern int check_selinux_permit (const char *perm_name);
|
||||
#endif
|
||||
|
||||
/* semanage.c */
|
||||
@@ -398,17 +425,19 @@ extern int set_filesize_limit (int blocks);
|
||||
extern int user_busy (const char *name, uid_t uid);
|
||||
|
||||
/* utmp.c */
|
||||
#ifndef USE_UTMPX
|
||||
extern /*@null@*/struct utmp *get_current_utmp (void);
|
||||
extern struct utmp *prepare_utmp (const char *name,
|
||||
const char *line,
|
||||
const char *host,
|
||||
/*@null@*/const struct utmp *ut);
|
||||
extern int setutmp (struct utmp *ut);
|
||||
#ifdef USE_UTMPX
|
||||
#else
|
||||
extern /*@null@*/struct utmpx *get_current_utmp (void);
|
||||
extern struct utmpx *prepare_utmpx (const char *name,
|
||||
const char *line,
|
||||
const char *host,
|
||||
/*@null@*/const struct utmp *ut);
|
||||
/*@null@*/const struct utmpx *ut);
|
||||
extern int setutmpx (struct utmpx *utx);
|
||||
#endif /* USE_UTMPX */
|
||||
|
||||
|
||||
@@ -114,7 +114,8 @@ static struct commonio_db passwd_db = {
|
||||
false, /* changed */
|
||||
false, /* isopen */
|
||||
false, /* locked */
|
||||
false /* readonly */
|
||||
false, /* readonly */
|
||||
false /* setname */
|
||||
};
|
||||
|
||||
int pw_setdbname (const char *filename)
|
||||
|
||||
102
lib/selinux.c
102
lib/selinux.c
@@ -31,12 +31,13 @@
|
||||
|
||||
#ifdef WITH_SELINUX
|
||||
|
||||
#include <stdio.h>
|
||||
#include "defines.h"
|
||||
|
||||
#include <selinux/selinux.h>
|
||||
#include <selinux/context.h>
|
||||
#include "prototypes.h"
|
||||
|
||||
|
||||
static bool selinux_checked = false;
|
||||
static bool selinux_enabled;
|
||||
|
||||
@@ -98,6 +99,105 @@ int reset_selinux_file_context (void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Log callback for libselinux internal error reporting.
|
||||
*/
|
||||
__attribute__((__format__ (printf, 2, 3)))
|
||||
static int selinux_log_cb (int type, const char *fmt, ...) {
|
||||
va_list ap;
|
||||
char *buf;
|
||||
int r;
|
||||
#ifdef WITH_AUDIT
|
||||
static int selinux_audit_fd = -2;
|
||||
#endif
|
||||
|
||||
va_start (ap, fmt);
|
||||
r = vasprintf (&buf, fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
if (r < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef WITH_AUDIT
|
||||
if (-2 == selinux_audit_fd) {
|
||||
selinux_audit_fd = audit_open ();
|
||||
|
||||
if (-1 == selinux_audit_fd) {
|
||||
/* You get these only when the kernel doesn't have
|
||||
* audit compiled in. */
|
||||
if ( (errno != EINVAL)
|
||||
&& (errno != EPROTONOSUPPORT)
|
||||
&& (errno != EAFNOSUPPORT)) {
|
||||
|
||||
(void) fputs (_("Cannot open audit interface.\n"),
|
||||
stderr);
|
||||
SYSLOG ((LOG_WARN, "Cannot open audit interface."));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (-1 != selinux_audit_fd) {
|
||||
if (SELINUX_AVC == type) {
|
||||
if (audit_log_user_avc_message (selinux_audit_fd,
|
||||
AUDIT_USER_AVC, buf, NULL, NULL,
|
||||
NULL, 0) > 0) {
|
||||
goto skip_syslog;
|
||||
}
|
||||
} else if (SELINUX_ERROR == type) {
|
||||
if (audit_log_user_avc_message (selinux_audit_fd,
|
||||
AUDIT_USER_SELINUX_ERR, buf, NULL, NULL,
|
||||
NULL, 0) > 0) {
|
||||
goto skip_syslog;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
SYSLOG ((LOG_WARN, "libselinux: %s", buf));
|
||||
|
||||
skip_syslog:
|
||||
free (buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* check_selinux_permit - Check whether SELinux grants the given
|
||||
* operation
|
||||
*
|
||||
* Parameter is the SELinux permission name, e.g. rootok
|
||||
*
|
||||
* Returns 0 when permission is granted
|
||||
* or something failed but running in
|
||||
* permissive mode
|
||||
*/
|
||||
int check_selinux_permit (const char *perm_name)
|
||||
{
|
||||
char *user_context_str;
|
||||
int r;
|
||||
|
||||
if (0 == is_selinux_enabled ()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
selinux_set_callback (SELINUX_CB_LOG, (union selinux_callback) selinux_log_cb);
|
||||
|
||||
if (getprevcon (&user_context_str) != 0) {
|
||||
fprintf (stderr,
|
||||
_("%s: can not get previous SELinux process context: %s\n"),
|
||||
Prog, strerror (errno));
|
||||
SYSLOG ((LOG_WARN,
|
||||
"can not get previous SELinux process context: %s",
|
||||
strerror (errno)));
|
||||
return (security_getenforce () != 0);
|
||||
}
|
||||
|
||||
r = selinux_check_access (user_context_str, user_context_str, "passwd", perm_name, NULL);
|
||||
freecon (user_context_str);
|
||||
return r;
|
||||
}
|
||||
|
||||
#else /* !WITH_SELINUX */
|
||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
||||
#endif /* !WITH_SELINUX */
|
||||
|
||||
@@ -136,7 +136,7 @@ struct group *sgetgrent (const char *buf)
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
if (i < (NFIELDS - 1) || *grpfields[2] == '\0') {
|
||||
if (i < (NFIELDS - 1) || *grpfields[2] == '\0' || cp != NULL) {
|
||||
return (struct group *) 0;
|
||||
}
|
||||
grent.gr_name = grpfields[0];
|
||||
|
||||
@@ -90,6 +90,11 @@ struct passwd *sgetpwent (const char *buf)
|
||||
}
|
||||
}
|
||||
|
||||
/* something at the end, columns over shot */
|
||||
if( cp != NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
/*
|
||||
* There must be exactly NFIELDS colon separated fields or
|
||||
* the entry is invalid. Also, the UID and GID must be non-blank.
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "prototypes.h"
|
||||
#include "defines.h"
|
||||
#include "commonio.h"
|
||||
#include "getdef.h"
|
||||
#include "sgroupio.h"
|
||||
|
||||
/*@null@*/ /*@only@*/struct sgrp *__sgr_dup (const struct sgrp *sgent)
|
||||
@@ -237,7 +238,8 @@ static struct commonio_db gshadow_db = {
|
||||
false, /* changed */
|
||||
false, /* isopen */
|
||||
false, /* locked */
|
||||
false /* readonly */
|
||||
false, /* readonly */
|
||||
false /* setname */
|
||||
};
|
||||
|
||||
int sgr_setdbname (const char *filename)
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <shadow.h>
|
||||
#include <stdio.h>
|
||||
#include "commonio.h"
|
||||
#include "getdef.h"
|
||||
#include "shadowio.h"
|
||||
#ifdef WITH_TCB
|
||||
#include <tcb.h>
|
||||
@@ -113,7 +114,8 @@ static struct commonio_db shadow_db = {
|
||||
false, /* changed */
|
||||
false, /* isopen */
|
||||
false, /* locked */
|
||||
false /* readonly */
|
||||
false, /* readonly */
|
||||
false /* setname */
|
||||
};
|
||||
|
||||
int spw_setdbname (const char *filename)
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
#ifndef _SHADOWIO_H
|
||||
#define _SHADOWIO_H
|
||||
#ifndef SHADOWIO_H
|
||||
#define SHADOWIO_H
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
|
||||
@@ -68,8 +68,10 @@ int run_command (const char *cmd, const char *argv[],
|
||||
|
||||
do {
|
||||
wpid = waitpid (pid, status, 0);
|
||||
if ((pid_t)-1 == wpid && errno == ECHILD)
|
||||
break;
|
||||
} while ( ((pid_t)-1 == wpid && errno == EINTR)
|
||||
|| (wpid != pid));
|
||||
|| ((pid_t)-1 != wpid && wpid != pid));
|
||||
|
||||
if ((pid_t)-1 == wpid) {
|
||||
fprintf (stderr, "%s: waitpid (status: %d): %s\n",
|
||||
|
||||
75
lib/sssd.c
Normal file
75
lib/sssd.c
Normal file
@@ -0,0 +1,75 @@
|
||||
/* Author: Peter Vrabec <pvrabec@redhat.com> */
|
||||
|
||||
#include <config.h>
|
||||
#ifdef USE_SSSD
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/types.h>
|
||||
#include "exitcodes.h"
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
#include "sssd.h"
|
||||
|
||||
#define MSG_SSSD_FLUSH_CACHE_FAILED "%s: Failed to flush the sssd cache.\n"
|
||||
|
||||
int sssd_flush_cache (int dbflags)
|
||||
{
|
||||
int status, code, rv;
|
||||
const char *cmd = "/usr/sbin/sss_cache";
|
||||
char *sss_cache_args = NULL;
|
||||
const char *spawnedArgs[] = {"sss_cache", NULL, NULL};
|
||||
const char *spawnedEnv[] = {NULL};
|
||||
int i = 0;
|
||||
|
||||
sss_cache_args = malloc(4);
|
||||
if (sss_cache_args == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
sss_cache_args[i++] = '-';
|
||||
if (dbflags & SSSD_DB_PASSWD) {
|
||||
sss_cache_args[i++] = 'U';
|
||||
}
|
||||
if (dbflags & SSSD_DB_GROUP) {
|
||||
sss_cache_args[i++] = 'G';
|
||||
}
|
||||
sss_cache_args[i++] = '\0';
|
||||
if (i == 2) {
|
||||
/* Neither passwd nor group, nothing to do */
|
||||
free(sss_cache_args);
|
||||
return 0;
|
||||
}
|
||||
spawnedArgs[1] = sss_cache_args;
|
||||
|
||||
rv = run_command (cmd, spawnedArgs, spawnedEnv, &status);
|
||||
free(sss_cache_args);
|
||||
if (rv != 0) {
|
||||
/* run_command writes its own more detailed message. */
|
||||
(void) fprintf (stderr, _(MSG_SSSD_FLUSH_CACHE_FAILED), Prog);
|
||||
return -1;
|
||||
}
|
||||
|
||||
code = WEXITSTATUS (status);
|
||||
if (!WIFEXITED (status)) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: sss_cache did not terminate normally (signal %d)\n"),
|
||||
Prog, WTERMSIG (status));
|
||||
return -1;
|
||||
} else if (code == E_CMD_NOTFOUND) {
|
||||
/* sss_cache is not installed, or it is installed but uses an
|
||||
interpreter that is missing. Probably the former. */
|
||||
return 0;
|
||||
} else if (code != 0) {
|
||||
(void) fprintf (stderr, _("%s: sss_cache exited with status %d\n"),
|
||||
Prog, code);
|
||||
(void) fprintf (stderr, _(MSG_SSSD_FLUSH_CACHE_FAILED), Prog);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else /* USE_SSSD */
|
||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
||||
#endif /* USE_SSSD */
|
||||
|
||||
17
lib/sssd.h
Normal file
17
lib/sssd.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef _SSSD_H_
|
||||
#define _SSSD_H_
|
||||
|
||||
#define SSSD_DB_PASSWD 0x001
|
||||
#define SSSD_DB_GROUP 0x002
|
||||
|
||||
/*
|
||||
* sssd_flush_cache - flush specified service buffer in sssd cache
|
||||
*/
|
||||
#ifdef USE_SSSD
|
||||
extern int sssd_flush_cache (int dbflags);
|
||||
#else
|
||||
#define sssd_flush_cache(service) (0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -152,11 +152,6 @@ static struct commonio_ops subordinate_ops = {
|
||||
NULL, /* close_hook */
|
||||
};
|
||||
|
||||
static /*@observer@*/ /*@null*/const struct subordinate_range *subordinate_next(struct commonio_db *db)
|
||||
{
|
||||
return (const struct subordinate_range *)commonio_next (db);
|
||||
}
|
||||
|
||||
/*
|
||||
* range_exists: Check whether @owner owns any ranges
|
||||
*
|
||||
@@ -181,7 +176,7 @@ static const bool range_exists(struct commonio_db *db, const char *owner)
|
||||
* subuid @val.
|
||||
*
|
||||
* @db: database to query
|
||||
* @owner: owning uid being queuried
|
||||
* @owner: owning uid being queried
|
||||
* @val: subuid being searched for.
|
||||
*
|
||||
* Returns a range of subuids belonging to @owner and including the subuid
|
||||
@@ -221,7 +216,7 @@ static const struct subordinate_range *find_range(struct commonio_db *db,
|
||||
|
||||
/*
|
||||
* Search loop above did not produce any result. Let's rerun it,
|
||||
* but this time try to matcha actual UIDs. The first entry that
|
||||
* but this time try to match actual UIDs. The first entry that
|
||||
* matches is considered a success.
|
||||
* (It may be specified as literal UID or as another username which
|
||||
* has the same UID as the username we are looking for.)
|
||||
@@ -418,7 +413,7 @@ fail:
|
||||
* @start: the first uid in the owned range
|
||||
* @count: the number of uids in the range
|
||||
*
|
||||
* Return 1 if the range is already present or on succcess. On error
|
||||
* Return 1 if the range is already present or on success. On error
|
||||
* return 0 and set errno appropriately.
|
||||
*/
|
||||
static int add_range(struct commonio_db *db,
|
||||
@@ -550,7 +545,8 @@ static struct commonio_db subordinate_uid_db = {
|
||||
false, /* changed */
|
||||
false, /* isopen */
|
||||
false, /* locked */
|
||||
false /* readonly */
|
||||
false, /* readonly */
|
||||
false /* setname */
|
||||
};
|
||||
|
||||
int sub_uid_setdbname (const char *filename)
|
||||
@@ -631,7 +627,8 @@ static struct commonio_db subordinate_gid_db = {
|
||||
false, /* changed */
|
||||
false, /* isopen */
|
||||
false, /* locked */
|
||||
false /* readonly */
|
||||
false, /* readonly */
|
||||
false /* setname */
|
||||
};
|
||||
|
||||
int sub_gid_setdbname (const char *filename)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
EXTRA_DIST = .indent.pro xgetXXbyYY.c
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/lib
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/lib $(ECONF_CPPFLAGS)
|
||||
|
||||
noinst_LIBRARIES = libmisc.a
|
||||
|
||||
@@ -31,6 +31,7 @@ libmisc_a_SOURCES = \
|
||||
getdate.y \
|
||||
getgr_nam_gid.c \
|
||||
getrange.c \
|
||||
gettime.c \
|
||||
hushed.c \
|
||||
idmapping.h \
|
||||
idmapping.c \
|
||||
@@ -43,7 +44,8 @@ libmisc_a_SOURCES = \
|
||||
myname.c \
|
||||
obscure.c \
|
||||
pam_pass.c \
|
||||
pam_pass_non_interractive.c \
|
||||
pam_pass_non_interactive.c \
|
||||
prefix_flag.c \
|
||||
pwd2spwd.c \
|
||||
pwdcheck.c \
|
||||
pwd_init.c \
|
||||
@@ -70,3 +72,8 @@ libmisc_a_SOURCES = \
|
||||
xgetspnam.c \
|
||||
xmalloc.c \
|
||||
yesno.c
|
||||
|
||||
if WITH_BTRFS
|
||||
libmisc_a_SOURCES += btrfs.c
|
||||
endif
|
||||
|
||||
|
||||
110
libmisc/btrfs.c
Normal file
110
libmisc/btrfs.c
Normal file
@@ -0,0 +1,110 @@
|
||||
#include <linux/btrfs_tree.h>
|
||||
#include <linux/magic.h>
|
||||
#include <sys/statfs.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "prototypes.h"
|
||||
|
||||
static bool path_exists(const char *p)
|
||||
{
|
||||
struct stat sb;
|
||||
|
||||
return stat(p, &sb) == 0;
|
||||
}
|
||||
|
||||
static const char *btrfs_cmd(void)
|
||||
{
|
||||
const char *btrfs_paths[] = {"/sbin/btrfs",
|
||||
"/bin/btrfs", "/usr/sbin/btrfs", "/usr/bin/btrfs", NULL};
|
||||
const char *p;
|
||||
int i;
|
||||
|
||||
for (i = 0, p = btrfs_paths[i]; p; i++, p = btrfs_paths[i])
|
||||
if (path_exists(p))
|
||||
return p;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int run_btrfs_subvolume_cmd(const char *subcmd, const char *arg1, const char *arg2)
|
||||
{
|
||||
int status = 0;
|
||||
const char *cmd = btrfs_cmd();
|
||||
const char *argv[] = {
|
||||
"btrfs",
|
||||
"subvolume",
|
||||
subcmd,
|
||||
arg1,
|
||||
arg2,
|
||||
NULL
|
||||
};
|
||||
|
||||
if (access(cmd, X_OK)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (run_command(cmd, argv, NULL, &status))
|
||||
return -1;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
int btrfs_create_subvolume(const char *path)
|
||||
{
|
||||
return run_btrfs_subvolume_cmd("create", path, NULL);
|
||||
}
|
||||
|
||||
|
||||
int btrfs_remove_subvolume(const char *path)
|
||||
{
|
||||
return run_btrfs_subvolume_cmd("delete", "-C", path);
|
||||
}
|
||||
|
||||
|
||||
/* Adapted from btrfsprogs */
|
||||
/*
|
||||
* This intentionally duplicates btrfs_util_is_subvolume_fd() instead of opening
|
||||
* a file descriptor and calling it, because fstat() and fstatfs() don't accept
|
||||
* file descriptors opened with O_PATH on old kernels (before v3.6 and before
|
||||
* v3.12, respectively), but stat() and statfs() can be called on a path that
|
||||
* the user doesn't have read or write permissions to.
|
||||
*
|
||||
* returns:
|
||||
* 1 - btrfs subvolume
|
||||
* 0 - not btrfs subvolume
|
||||
* -1 - error
|
||||
*/
|
||||
int btrfs_is_subvolume(const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
int ret;
|
||||
|
||||
ret = is_btrfs(path);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
ret = stat(path, &st);
|
||||
if (ret == -1)
|
||||
return -1;
|
||||
|
||||
if (st.st_ino != BTRFS_FIRST_FREE_OBJECTID || !S_ISDIR(st.st_mode)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* Adapted from btrfsprogs */
|
||||
int is_btrfs(const char *path)
|
||||
{
|
||||
struct statfs sfs;
|
||||
int ret;
|
||||
|
||||
ret = statfs(path, &sfs);
|
||||
if (ret == -1)
|
||||
return -1;
|
||||
|
||||
return sfs.f_type == BTRFS_SUPER_MAGIC;
|
||||
}
|
||||
|
||||
@@ -46,11 +46,18 @@
|
||||
#include "defines.h"
|
||||
#include "chkname.h"
|
||||
|
||||
int allow_bad_names = false;
|
||||
|
||||
static bool is_valid_name (const char *name)
|
||||
{
|
||||
if (allow_bad_names) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* User/group names must match [a-z_][a-z0-9_-]*[$]
|
||||
*/
|
||||
|
||||
if (('\0' == *name) ||
|
||||
!((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
|
||||
return false;
|
||||
|
||||
@@ -50,7 +50,7 @@ static bool is_listed (const char *cfgin, const char *tty, bool def);
|
||||
static bool is_listed (const char *cfgin, const char *tty, bool def)
|
||||
{
|
||||
FILE *fp;
|
||||
char buf[200], *s;
|
||||
char buf[1024], *s;
|
||||
const char *cons;
|
||||
|
||||
/*
|
||||
@@ -70,7 +70,8 @@ static bool is_listed (const char *cfgin, const char *tty, bool def)
|
||||
|
||||
if (*cons != '/') {
|
||||
char *pbuf;
|
||||
strcpy (buf, cons);
|
||||
strncpy (buf, cons, sizeof (buf));
|
||||
buf[sizeof (buf) - 1] = '\0';
|
||||
pbuf = &buf[0];
|
||||
while ((s = strtok (pbuf, ":")) != NULL) {
|
||||
if (strcmp (s, tty) == 0) {
|
||||
|
||||
@@ -69,7 +69,7 @@ extern int failcheck (uid_t uid, struct faillog *fl, bool failed);
|
||||
extern void failprint (const struct faillog *);
|
||||
|
||||
/*
|
||||
* failtmp - update the cummulative failure log
|
||||
* failtmp - update the cumulative failure log
|
||||
*
|
||||
* failtmp updates the (struct utmp) formatted failure log which
|
||||
* maintains a record of all login failures.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 1991 - 1994, Julianne Frances Haugh
|
||||
* Copyright (c) 2008 - 2011, Nicolas François
|
||||
* Copyright (c) 2014, Red Hat, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -38,6 +39,117 @@
|
||||
#include "groupio.h"
|
||||
#include "getdef.h"
|
||||
|
||||
/*
|
||||
* get_ranges - Get the minimum and maximum ID ranges for the search
|
||||
*
|
||||
* This function will return the minimum and maximum ranges for IDs
|
||||
*
|
||||
* 0: The function completed successfully
|
||||
* EINVAL: The provided ranges are impossible (such as maximum < minimum)
|
||||
*
|
||||
* preferred_min: The special-case minimum value for a specifically-
|
||||
* requested ID, which may be lower than the standard min_id
|
||||
*/
|
||||
static int get_ranges (bool sys_group, gid_t *min_id, gid_t *max_id,
|
||||
gid_t *preferred_min)
|
||||
{
|
||||
gid_t gid_def_max = 0;
|
||||
|
||||
if (sys_group) {
|
||||
/* System groups */
|
||||
|
||||
/* A requested ID is allowed to be below the autoselect range */
|
||||
*preferred_min = (gid_t) 1;
|
||||
|
||||
/* Get the minimum ID range from login.defs or default to 101 */
|
||||
*min_id = (gid_t) getdef_ulong ("SYS_GID_MIN", 101UL);
|
||||
|
||||
/*
|
||||
* If SYS_GID_MAX is unspecified, we should assume it to be one
|
||||
* less than the GID_MIN (which is reserved for non-system accounts)
|
||||
*/
|
||||
gid_def_max = (gid_t) getdef_ulong ("GID_MIN", 1000UL) - 1;
|
||||
*max_id = (gid_t) getdef_ulong ("SYS_GID_MAX",
|
||||
(unsigned long) gid_def_max);
|
||||
|
||||
/* Check that the ranges make sense */
|
||||
if (*max_id < *min_id) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: SYS_GID_MIN (%lu), "
|
||||
"GID_MIN (%lu), SYS_GID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) *min_id,
|
||||
getdef_ulong ("GID_MIN", 1000UL),
|
||||
(unsigned long) *max_id);
|
||||
return EINVAL;
|
||||
}
|
||||
} else {
|
||||
/* Non-system groups */
|
||||
|
||||
/* Get the values from login.defs or use reasonable defaults */
|
||||
*min_id = (gid_t) getdef_ulong ("GID_MIN", 1000UL);
|
||||
*max_id = (gid_t) getdef_ulong ("GID_MAX", 60000UL);
|
||||
|
||||
/*
|
||||
* The preferred minimum should match the standard ID minimum
|
||||
* for non-system groups.
|
||||
*/
|
||||
*preferred_min = *min_id;
|
||||
|
||||
/* Check that the ranges make sense */
|
||||
if (*max_id < *min_id) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: GID_MIN (%lu), "
|
||||
"GID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) *min_id,
|
||||
(unsigned long) *max_id);
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* check_gid - See if the requested GID is available
|
||||
*
|
||||
* On success, return 0
|
||||
* If the ID is in use, return EEXIST
|
||||
* If the ID is outside the range, return ERANGE
|
||||
* In other cases, return errno from getgrgid()
|
||||
*/
|
||||
static int check_gid (const gid_t gid,
|
||||
const gid_t gid_min,
|
||||
const gid_t gid_max,
|
||||
bool *used_gids)
|
||||
{
|
||||
/* First test that the preferred ID is in the range */
|
||||
if (gid < gid_min || gid > gid_max) {
|
||||
return ERANGE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether we already detected this GID
|
||||
* using the gr_next() loop
|
||||
*/
|
||||
if (used_gids != NULL && used_gids[gid]) {
|
||||
return EEXIST;
|
||||
}
|
||||
/* Check if the GID exists according to NSS */
|
||||
errno = 0;
|
||||
if (prefix_getgrgid (gid) != NULL) {
|
||||
return EEXIST;
|
||||
} else {
|
||||
/* getgrgid() was NULL
|
||||
* we have to ignore errors as temporary
|
||||
* failures of remote user identity services
|
||||
* would completely block user/group creation
|
||||
*/
|
||||
}
|
||||
|
||||
/* If we've made it here, the GID must be available */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* find_new_gid - Find a new unused GID.
|
||||
*
|
||||
@@ -49,161 +161,338 @@
|
||||
* Return 0 on success, -1 if no unused GIDs are available.
|
||||
*/
|
||||
int find_new_gid (bool sys_group,
|
||||
gid_t *gid,
|
||||
/*@null@*/gid_t const *preferred_gid)
|
||||
gid_t *gid,
|
||||
/*@null@*/gid_t const *preferred_gid)
|
||||
{
|
||||
const struct group *grp;
|
||||
gid_t gid_min, gid_max, group_id;
|
||||
bool *used_gids;
|
||||
const struct group *grp;
|
||||
gid_t gid_min, gid_max, preferred_min;
|
||||
gid_t id;
|
||||
gid_t lowest_found, highest_found;
|
||||
int result;
|
||||
int nospam = 0;
|
||||
|
||||
assert (gid != NULL);
|
||||
assert(gid != NULL);
|
||||
|
||||
if (!sys_group) {
|
||||
gid_min = (gid_t) getdef_ulong ("GID_MIN", 1000UL);
|
||||
gid_max = (gid_t) getdef_ulong ("GID_MAX", 60000UL);
|
||||
if (gid_max < gid_min) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: GID_MIN (%lu), GID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) gid_min, (unsigned long) gid_max);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
gid_min = (gid_t) getdef_ulong ("SYS_GID_MIN", 101UL);
|
||||
gid_max = (gid_t) getdef_ulong ("GID_MIN", 1000UL) - 1;
|
||||
gid_max = (gid_t) getdef_ulong ("SYS_GID_MAX", (unsigned long) gid_max);
|
||||
if (gid_max < gid_min) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: SYS_GID_MIN (%lu), GID_MIN (%lu), SYS_GID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) gid_min, getdef_ulong ("GID_MIN", 1000UL), (unsigned long) gid_max);
|
||||
/*
|
||||
* First, figure out what ID range is appropriate for
|
||||
* automatic assignment
|
||||
*/
|
||||
result = get_ranges (sys_group, &gid_min, &gid_max, &preferred_min);
|
||||
if (result == EINVAL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check if the preferred GID is available */
|
||||
if (preferred_gid) {
|
||||
result = check_gid (*preferred_gid, preferred_min, gid_max, NULL);
|
||||
if (result == 0) {
|
||||
/*
|
||||
* Make sure the GID isn't queued for use already
|
||||
*/
|
||||
if (gr_locate_gid (*preferred_gid) == NULL) {
|
||||
*gid = *preferred_gid;
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* gr_locate_gid() found the GID in an as-yet uncommitted
|
||||
* entry. We'll proceed below and auto-set a GID.
|
||||
*/
|
||||
} else if (result == EEXIST || result == ERANGE) {
|
||||
/*
|
||||
* Continue on below. At this time, we won't
|
||||
* treat these two cases differently.
|
||||
*/
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred. We should report
|
||||
* this and fail the group creation.
|
||||
* This differs from the automatic creation
|
||||
* behavior below, since if a specific GID was
|
||||
* requested and generated an error, the user is
|
||||
* more likely to want to stop and address the
|
||||
* issue.
|
||||
*/
|
||||
fprintf (stderr,
|
||||
_("%s: Encountered error attempting to use "
|
||||
"preferred GID: %s\n"),
|
||||
Prog, strerror (result));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Search the entire group file,
|
||||
* looking for the next unused value.
|
||||
*
|
||||
* We first check the local database with gr_rewind/gr_next to find
|
||||
* all local values that are in use.
|
||||
*
|
||||
* We then compare the next free value to all databases (local and
|
||||
* remote) and iterate until we find a free one. If there are free
|
||||
* values beyond the lowest (system groups) or highest (non-system
|
||||
* groups), we will prefer those and avoid potentially reclaiming a
|
||||
* deleted group (which can be a security issue, since it may grant
|
||||
* access to files belonging to that former group).
|
||||
*
|
||||
* If there are no GIDs available at the end of the search, we will
|
||||
* have no choice but to iterate through the range looking for gaps.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Create an array to hold all of the discovered GIDs */
|
||||
used_gids = malloc (sizeof (bool) * (gid_max +1));
|
||||
if (NULL == used_gids) {
|
||||
fprintf (stderr,
|
||||
_("%s: failed to allocate memory: %s\n"),
|
||||
Prog, strerror (errno));
|
||||
_("%s: failed to allocate memory: %s\n"),
|
||||
Prog, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
memset (used_gids, false, sizeof (bool) * (gid_max + 1));
|
||||
|
||||
if ( (NULL != preferred_gid)
|
||||
&& (*preferred_gid >= gid_min)
|
||||
&& (*preferred_gid <= gid_max)
|
||||
/* Check if the user exists according to NSS */
|
||||
&& (getgrgid (*preferred_gid) == NULL)
|
||||
/* Check also the local database in case of uncommitted
|
||||
* changes */
|
||||
&& (gr_locate_gid (*preferred_gid) == NULL)) {
|
||||
*gid = *preferred_gid;
|
||||
free (used_gids);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Search the entire group file,
|
||||
* looking for the largest unused value.
|
||||
*
|
||||
* We check the list of groups according to NSS (setgrent/getgrent),
|
||||
* but we also check the local database (gr_rewind/gr_next) in case
|
||||
* some groups were created but the changes were not committed yet.
|
||||
*/
|
||||
if (sys_group) {
|
||||
gid_t id;
|
||||
/* setgrent / getgrent / endgrent can be very slow with
|
||||
* LDAP configurations (and many accounts).
|
||||
* Since there is a limited amount of IDs to be tested
|
||||
* for system accounts, we just check the existence
|
||||
* of IDs with getgrgid.
|
||||
/* First look for the lowest and highest value in the local database */
|
||||
(void) gr_rewind ();
|
||||
highest_found = gid_min;
|
||||
lowest_found = gid_max;
|
||||
while ((grp = gr_next ()) != NULL) {
|
||||
/*
|
||||
* Does this entry have a lower GID than the lowest we've found
|
||||
* so far?
|
||||
*/
|
||||
group_id = gid_max;
|
||||
for (id = gid_max; id >= gid_min; id--) {
|
||||
if (getgrgid (id) != NULL) {
|
||||
group_id = id - 1;
|
||||
used_gids[id] = true;
|
||||
}
|
||||
if ((grp->gr_gid <= lowest_found) && (grp->gr_gid >= gid_min)) {
|
||||
lowest_found = grp->gr_gid - 1;
|
||||
}
|
||||
|
||||
(void) gr_rewind ();
|
||||
while ((grp = gr_next ()) != NULL) {
|
||||
if ((grp->gr_gid <= group_id) && (grp->gr_gid >= gid_min)) {
|
||||
group_id = grp->gr_gid - 1;
|
||||
}
|
||||
/* create index of used GIDs */
|
||||
if (grp->gr_gid <= gid_max) {
|
||||
used_gids[grp->gr_gid] = true;
|
||||
}
|
||||
/*
|
||||
* Does this entry have a higher GID than the highest we've found
|
||||
* so far?
|
||||
*/
|
||||
if ((grp->gr_gid >= highest_found) && (grp->gr_gid <= gid_max)) {
|
||||
highest_found = grp->gr_gid + 1;
|
||||
}
|
||||
} else {
|
||||
group_id = gid_min;
|
||||
setgrent ();
|
||||
while ((grp = getgrent ()) != NULL) {
|
||||
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
|
||||
group_id = grp->gr_gid + 1;
|
||||
}
|
||||
/* create index of used GIDs */
|
||||
if (grp->gr_gid <= gid_max) {
|
||||
used_gids[grp->gr_gid] = true;
|
||||
}
|
||||
}
|
||||
endgrent ();
|
||||
|
||||
(void) gr_rewind ();
|
||||
while ((grp = gr_next ()) != NULL) {
|
||||
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
|
||||
group_id = grp->gr_gid + 1;
|
||||
}
|
||||
/* create index of used GIDs */
|
||||
if (grp->gr_gid <= gid_max) {
|
||||
used_gids[grp->gr_gid] = true;
|
||||
}
|
||||
/* create index of used GIDs */
|
||||
if (grp->gr_gid >= gid_min
|
||||
&& grp->gr_gid <= gid_max) {
|
||||
|
||||
used_gids[grp->gr_gid] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If a group (resp. system group) with GID equal to GID_MAX (resp.
|
||||
* GID_MIN) exists, the above algorithm will give us GID_MAX+1
|
||||
* (resp. GID_MIN-1) even if not unique. Search for the first free
|
||||
* GID starting with GID_MIN (resp. GID_MAX).
|
||||
*/
|
||||
if (sys_group) {
|
||||
if (group_id < gid_min) {
|
||||
for (group_id = gid_max; group_id >= gid_min; group_id--) {
|
||||
if (false == used_gids[group_id]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (group_id < gid_min) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique system GID (no more available GIDs)\n"),
|
||||
Prog);
|
||||
SYSLOG ((LOG_WARN,
|
||||
"no more available GID on the system"));
|
||||
/*
|
||||
* For system groups, we want to start from the
|
||||
* top of the range and work downwards.
|
||||
*/
|
||||
|
||||
/*
|
||||
* At the conclusion of the gr_next() search, we will either
|
||||
* have a presumed-free GID or we will be at GID_MIN - 1.
|
||||
*/
|
||||
if (lowest_found < gid_min) {
|
||||
/*
|
||||
* In this case, a GID is in use at GID_MIN.
|
||||
*
|
||||
* We will reset the search to GID_MAX and proceed down
|
||||
* through all the GIDs (skipping those we detected with
|
||||
* used_gids) for a free one. It is a known issue that
|
||||
* this may result in reusing a previously-deleted GID,
|
||||
* so administrators should be instructed to use this
|
||||
* auto-detection with care (and prefer to assign GIDs
|
||||
* explicitly).
|
||||
*/
|
||||
lowest_found = gid_max;
|
||||
}
|
||||
|
||||
/* Search through all of the IDs in the range */
|
||||
for (id = lowest_found; id >= gid_min; id--) {
|
||||
result = check_gid (id, gid_min, gid_max, used_gids);
|
||||
if (result == 0) {
|
||||
/* This GID is available. Return it. */
|
||||
*gid = id;
|
||||
free (used_gids);
|
||||
return -1;
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This GID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique system GID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available GIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later GID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (group_id > gid_max) {
|
||||
for (group_id = gid_min; group_id <= gid_max; group_id++) {
|
||||
if (false == used_gids[group_id]) {
|
||||
break;
|
||||
|
||||
/*
|
||||
* If we get all the way through the loop, try again from GID_MAX,
|
||||
* unless that was where we previously started. (NOTE: the worst-case
|
||||
* scenario here is that we will run through (GID_MAX - GID_MIN - 1)
|
||||
* cycles *again* if we fall into this case with lowest_found as
|
||||
* GID_MAX - 1, all groups in the range in use and maintained by
|
||||
* network services such as LDAP.)
|
||||
*/
|
||||
if (lowest_found != gid_max) {
|
||||
for (id = gid_max; id >= gid_min; id--) {
|
||||
result = check_gid (id, gid_min, gid_max, used_gids);
|
||||
if (result == 0) {
|
||||
/* This GID is available. Return it. */
|
||||
*gid = id;
|
||||
free (used_gids);
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This GID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique system GID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available GIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later GID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
if (group_id > gid_max) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique GID (no more available GIDs)\n"),
|
||||
Prog);
|
||||
SYSLOG ((LOG_WARN, "no more available GID on the system"));
|
||||
}
|
||||
} else { /* !sys_group */
|
||||
/*
|
||||
* For non-system groups, we want to start from the
|
||||
* bottom of the range and work upwards.
|
||||
*/
|
||||
|
||||
/*
|
||||
* At the conclusion of the gr_next() search, we will either
|
||||
* have a presumed-free GID or we will be at GID_MAX + 1.
|
||||
*/
|
||||
if (highest_found > gid_max) {
|
||||
/*
|
||||
* In this case, a GID is in use at GID_MAX.
|
||||
*
|
||||
* We will reset the search to GID_MIN and proceed up
|
||||
* through all the GIDs (skipping those we detected with
|
||||
* used_gids) for a free one. It is a known issue that
|
||||
* this may result in reusing a previously-deleted GID,
|
||||
* so administrators should be instructed to use this
|
||||
* auto-detection with care (and prefer to assign GIDs
|
||||
* explicitly).
|
||||
*/
|
||||
highest_found = gid_min;
|
||||
}
|
||||
|
||||
/* Search through all of the IDs in the range */
|
||||
for (id = highest_found; id <= gid_max; id++) {
|
||||
result = check_gid (id, gid_min, gid_max, used_gids);
|
||||
if (result == 0) {
|
||||
/* This GID is available. Return it. */
|
||||
*gid = id;
|
||||
free (used_gids);
|
||||
return -1;
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This GID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique GID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available GIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later GID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get all the way through the loop, try again from GID_MIN,
|
||||
* unless that was where we previously started. (NOTE: the worst-case
|
||||
* scenario here is that we will run through (GID_MAX - GID_MIN - 1)
|
||||
* cycles *again* if we fall into this case with highest_found as
|
||||
* GID_MIN + 1, all groups in the range in use and maintained by
|
||||
* network services such as LDAP.)
|
||||
*/
|
||||
if (highest_found != gid_min) {
|
||||
for (id = gid_min; id <= gid_max; id++) {
|
||||
result = check_gid (id, gid_min, gid_max, used_gids);
|
||||
if (result == 0) {
|
||||
/* This GID is available. Return it. */
|
||||
*gid = id;
|
||||
free (used_gids);
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This GID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique GID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available GIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later GID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* The code reached here and found no available IDs in the range */
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique GID (no more available GIDs)\n"),
|
||||
Prog);
|
||||
SYSLOG ((LOG_WARN, "no more available GIDs on the system"));
|
||||
free (used_gids);
|
||||
*gid = group_id;
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 1991 - 1994, Julianne Frances Haugh
|
||||
* Copyright (c) 2008 - 2011, Nicolas François
|
||||
* Copyright (c) 2014, Red Hat, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -38,6 +39,117 @@
|
||||
#include "pwio.h"
|
||||
#include "getdef.h"
|
||||
|
||||
/*
|
||||
* get_ranges - Get the minimum and maximum ID ranges for the search
|
||||
*
|
||||
* This function will return the minimum and maximum ranges for IDs
|
||||
*
|
||||
* 0: The function completed successfully
|
||||
* EINVAL: The provided ranges are impossible (such as maximum < minimum)
|
||||
*
|
||||
* preferred_min: The special-case minimum value for a specifically-
|
||||
* requested ID, which may be lower than the standard min_id
|
||||
*/
|
||||
static int get_ranges (bool sys_user, uid_t *min_id, uid_t *max_id,
|
||||
uid_t *preferred_min)
|
||||
{
|
||||
uid_t uid_def_max = 0;
|
||||
|
||||
if (sys_user) {
|
||||
/* System users */
|
||||
|
||||
/* A requested ID is allowed to be below the autoselect range */
|
||||
*preferred_min = (uid_t) 1;
|
||||
|
||||
/* Get the minimum ID range from login.defs or default to 101 */
|
||||
*min_id = (uid_t) getdef_ulong ("SYS_UID_MIN", 101UL);
|
||||
|
||||
/*
|
||||
* If SYS_UID_MAX is unspecified, we should assume it to be one
|
||||
* less than the UID_MIN (which is reserved for non-system accounts)
|
||||
*/
|
||||
uid_def_max = (uid_t) getdef_ulong ("UID_MIN", 1000UL) - 1;
|
||||
*max_id = (uid_t) getdef_ulong ("SYS_UID_MAX",
|
||||
(unsigned long) uid_def_max);
|
||||
|
||||
/* Check that the ranges make sense */
|
||||
if (*max_id < *min_id) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: SYS_UID_MIN (%lu), "
|
||||
"UID_MIN (%lu), SYS_UID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) *min_id,
|
||||
getdef_ulong ("UID_MIN", 1000UL),
|
||||
(unsigned long) *max_id);
|
||||
return EINVAL;
|
||||
}
|
||||
} else {
|
||||
/* Non-system users */
|
||||
|
||||
/* Get the values from login.defs or use reasonable defaults */
|
||||
*min_id = (uid_t) getdef_ulong ("UID_MIN", 1000UL);
|
||||
*max_id = (uid_t) getdef_ulong ("UID_MAX", 60000UL);
|
||||
|
||||
/*
|
||||
* The preferred minimum should match the standard ID minimum
|
||||
* for non-system users.
|
||||
*/
|
||||
*preferred_min = *min_id;
|
||||
|
||||
/* Check that the ranges make sense */
|
||||
if (*max_id < *min_id) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: UID_MIN (%lu), "
|
||||
"UID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) *min_id,
|
||||
(unsigned long) *max_id);
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* check_uid - See if the requested UID is available
|
||||
*
|
||||
* On success, return 0
|
||||
* If the ID is in use, return EEXIST
|
||||
* If the ID is outside the range, return ERANGE
|
||||
* In other cases, return errno from getpwuid()
|
||||
*/
|
||||
static int check_uid(const uid_t uid,
|
||||
const uid_t uid_min,
|
||||
const uid_t uid_max,
|
||||
bool *used_uids)
|
||||
{
|
||||
/* First test that the preferred ID is in the range */
|
||||
if (uid < uid_min || uid > uid_max) {
|
||||
return ERANGE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether we already detected this UID
|
||||
* using the pw_next() loop
|
||||
*/
|
||||
if (used_uids != NULL && used_uids[uid]) {
|
||||
return EEXIST;
|
||||
}
|
||||
/* Check if the UID exists according to NSS */
|
||||
errno = 0;
|
||||
if (prefix_getpwuid(uid) != NULL) {
|
||||
return EEXIST;
|
||||
} else {
|
||||
/* getpwuid() was NULL
|
||||
* we have to ignore errors as temporary
|
||||
* failures of remote user identity services
|
||||
* would completely block user/group creation
|
||||
*/
|
||||
}
|
||||
|
||||
/* If we've made it here, the UID must be available */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* find_new_uid - Find a new unused UID.
|
||||
*
|
||||
@@ -48,162 +160,339 @@
|
||||
*
|
||||
* Return 0 on success, -1 if no unused UIDs are available.
|
||||
*/
|
||||
int find_new_uid (bool sys_user,
|
||||
uid_t *uid,
|
||||
/*@null@*/uid_t const *preferred_uid)
|
||||
int find_new_uid(bool sys_user,
|
||||
uid_t *uid,
|
||||
/*@null@*/uid_t const *preferred_uid)
|
||||
{
|
||||
const struct passwd *pwd;
|
||||
uid_t uid_min, uid_max, user_id;
|
||||
bool *used_uids;
|
||||
const struct passwd *pwd;
|
||||
uid_t uid_min, uid_max, preferred_min;
|
||||
uid_t id;
|
||||
uid_t lowest_found, highest_found;
|
||||
int result;
|
||||
int nospam = 0;
|
||||
|
||||
assert (uid != NULL);
|
||||
|
||||
if (!sys_user) {
|
||||
uid_min = (uid_t) getdef_ulong ("UID_MIN", 1000UL);
|
||||
uid_max = (uid_t) getdef_ulong ("UID_MAX", 60000UL);
|
||||
if (uid_max < uid_min) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: UID_MIN (%lu), UID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) uid_min, (unsigned long) uid_max);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
uid_min = (uid_t) getdef_ulong ("SYS_UID_MIN", 101UL);
|
||||
uid_max = (uid_t) getdef_ulong ("UID_MIN", 1000UL) - 1;
|
||||
uid_max = (uid_t) getdef_ulong ("SYS_UID_MAX", (unsigned long) uid_max);
|
||||
if (uid_max < uid_min) {
|
||||
(void) fprintf (stderr,
|
||||
_("%s: Invalid configuration: SYS_UID_MIN (%lu), UID_MIN (%lu), SYS_UID_MAX (%lu)\n"),
|
||||
Prog, (unsigned long) uid_min, getdef_ulong ("UID_MIN", 1000UL), (unsigned long) uid_max);
|
||||
/*
|
||||
* First, figure out what ID range is appropriate for
|
||||
* automatic assignment
|
||||
*/
|
||||
result = get_ranges (sys_user, &uid_min, &uid_max, &preferred_min);
|
||||
if (result == EINVAL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check if the preferred UID is available */
|
||||
if (preferred_uid) {
|
||||
result = check_uid (*preferred_uid, preferred_min, uid_max, NULL);
|
||||
if (result == 0) {
|
||||
/*
|
||||
* Make sure the UID isn't queued for use already
|
||||
*/
|
||||
if (pw_locate_uid (*preferred_uid) == NULL) {
|
||||
*uid = *preferred_uid;
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* pw_locate_uid() found the UID in an as-yet uncommitted
|
||||
* entry. We'll proceed below and auto-set an UID.
|
||||
*/
|
||||
} else if (result == EEXIST || result == ERANGE) {
|
||||
/*
|
||||
* Continue on below. At this time, we won't
|
||||
* treat these two cases differently.
|
||||
*/
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred. We should report
|
||||
* this and fail the user creation.
|
||||
* This differs from the automatic creation
|
||||
* behavior below, since if a specific UID was
|
||||
* requested and generated an error, the user is
|
||||
* more likely to want to stop and address the
|
||||
* issue.
|
||||
*/
|
||||
fprintf (stderr,
|
||||
_("%s: Encountered error attempting to use "
|
||||
"preferred UID: %s\n"),
|
||||
Prog, strerror (result));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Search the entire passwd file,
|
||||
* looking for the next unused value.
|
||||
*
|
||||
* We first check the local database with pw_rewind/pw_next to find
|
||||
* all local values that are in use.
|
||||
*
|
||||
* We then compare the next free value to all databases (local and
|
||||
* remote) and iterate until we find a free one. If there are free
|
||||
* values beyond the lowest (system users) or highest (non-system
|
||||
* users), we will prefer those and avoid potentially reclaiming a
|
||||
* deleted user (which can be a security issue, since it may grant
|
||||
* access to files belonging to that former user).
|
||||
*
|
||||
* If there are no UIDs available at the end of the search, we will
|
||||
* have no choice but to iterate through the range looking for gaps.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Create an array to hold all of the discovered UIDs */
|
||||
used_uids = malloc (sizeof (bool) * (uid_max +1));
|
||||
if (NULL == used_uids) {
|
||||
fprintf (stderr,
|
||||
_("%s: failed to allocate memory: %s\n"),
|
||||
Prog, strerror (errno));
|
||||
_("%s: failed to allocate memory: %s\n"),
|
||||
Prog, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
memset (used_uids, false, sizeof (bool) * (uid_max + 1));
|
||||
|
||||
if ( (NULL != preferred_uid)
|
||||
&& (*preferred_uid >= uid_min)
|
||||
&& (*preferred_uid <= uid_max)
|
||||
/* Check if the user exists according to NSS */
|
||||
&& (getpwuid (*preferred_uid) == NULL)
|
||||
/* Check also the local database in case of uncommitted
|
||||
* changes */
|
||||
&& (pw_locate_uid (*preferred_uid) == NULL)) {
|
||||
*uid = *preferred_uid;
|
||||
free (used_uids);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Search the entire password file,
|
||||
* looking for the largest unused value.
|
||||
*
|
||||
* We check the list of users according to NSS (setpwent/getpwent),
|
||||
* but we also check the local database (pw_rewind/pw_next) in case
|
||||
* some users were created but the changes were not committed yet.
|
||||
*/
|
||||
if (sys_user) {
|
||||
uid_t id;
|
||||
/* setpwent / getpwent / endpwent can be very slow with
|
||||
* LDAP configurations (and many accounts).
|
||||
* Since there is a limited amount of IDs to be tested
|
||||
* for system accounts, we just check the existence
|
||||
* of IDs with getpwuid.
|
||||
/* First look for the lowest and highest value in the local database */
|
||||
(void) pw_rewind ();
|
||||
highest_found = uid_min;
|
||||
lowest_found = uid_max;
|
||||
while ((pwd = pw_next ()) != NULL) {
|
||||
/*
|
||||
* Does this entry have a lower UID than the lowest we've found
|
||||
* so far?
|
||||
*/
|
||||
user_id = uid_max;
|
||||
for (id = uid_max; id >= uid_min; id--) {
|
||||
if (getpwuid (id) != NULL) {
|
||||
user_id = id - 1;
|
||||
used_uids[id] = true;
|
||||
}
|
||||
if ((pwd->pw_uid <= lowest_found) && (pwd->pw_uid >= uid_min)) {
|
||||
lowest_found = pwd->pw_uid - 1;
|
||||
}
|
||||
|
||||
(void) pw_rewind ();
|
||||
while ((pwd = pw_next ()) != NULL) {
|
||||
if ((pwd->pw_uid <= user_id) && (pwd->pw_uid >= uid_min)) {
|
||||
user_id = pwd->pw_uid - 1;
|
||||
}
|
||||
/* create index of used UIDs */
|
||||
if (pwd->pw_uid <= uid_max) {
|
||||
used_uids[pwd->pw_uid] = true;
|
||||
}
|
||||
/*
|
||||
* Does this entry have a higher UID than the highest we've found
|
||||
* so far?
|
||||
*/
|
||||
if ((pwd->pw_uid >= highest_found) && (pwd->pw_uid <= uid_max)) {
|
||||
highest_found = pwd->pw_uid + 1;
|
||||
}
|
||||
} else {
|
||||
user_id = uid_min;
|
||||
setpwent ();
|
||||
while ((pwd = getpwent ()) != NULL) {
|
||||
if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) {
|
||||
user_id = pwd->pw_uid + 1;
|
||||
}
|
||||
/* create index of used UIDs */
|
||||
if (pwd->pw_uid <= uid_max) {
|
||||
used_uids[pwd->pw_uid] = true;
|
||||
}
|
||||
}
|
||||
endpwent ();
|
||||
|
||||
(void) pw_rewind ();
|
||||
while ((pwd = pw_next ()) != NULL) {
|
||||
if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) {
|
||||
user_id = pwd->pw_uid + 1;
|
||||
}
|
||||
/* create index of used UIDs */
|
||||
if (pwd->pw_uid <= uid_max) {
|
||||
used_uids[pwd->pw_uid] = true;
|
||||
}
|
||||
/* create index of used UIDs */
|
||||
if (pwd->pw_uid >= uid_min
|
||||
&& pwd->pw_uid <= uid_max) {
|
||||
|
||||
used_uids[pwd->pw_uid] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If a user (resp. system user) with UID equal to UID_MAX (resp.
|
||||
* UID_MIN) exists, the above algorithm will give us UID_MAX+1
|
||||
* (resp. UID_MIN-1) even if not unique. Search for the first free
|
||||
* UID starting with UID_MIN (resp. UID_MAX).
|
||||
*/
|
||||
if (sys_user) {
|
||||
if (user_id < uid_min) {
|
||||
for (user_id = uid_max; user_id >= uid_min; user_id--) {
|
||||
if (false == used_uids[user_id]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (user_id < uid_min ) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique system UID (no more available UIDs)\n"),
|
||||
Prog);
|
||||
SYSLOG ((LOG_WARN,
|
||||
"no more available UID on the system"));
|
||||
/*
|
||||
* For system users, we want to start from the
|
||||
* top of the range and work downwards.
|
||||
*/
|
||||
|
||||
/*
|
||||
* At the conclusion of the pw_next() search, we will either
|
||||
* have a presumed-free UID or we will be at UID_MIN - 1.
|
||||
*/
|
||||
if (lowest_found < uid_min) {
|
||||
/*
|
||||
* In this case, an UID is in use at UID_MIN.
|
||||
*
|
||||
* We will reset the search to UID_MAX and proceed down
|
||||
* through all the UIDs (skipping those we detected with
|
||||
* used_uids) for a free one. It is a known issue that
|
||||
* this may result in reusing a previously-deleted UID,
|
||||
* so administrators should be instructed to use this
|
||||
* auto-detection with care (and prefer to assign UIDs
|
||||
* explicitly).
|
||||
*/
|
||||
lowest_found = uid_max;
|
||||
}
|
||||
|
||||
/* Search through all of the IDs in the range */
|
||||
for (id = lowest_found; id >= uid_min; id--) {
|
||||
result = check_uid (id, uid_min, uid_max, used_uids);
|
||||
if (result == 0) {
|
||||
/* This UID is available. Return it. */
|
||||
*uid = id;
|
||||
free (used_uids);
|
||||
return -1;
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This UID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique system UID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available UIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later UID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (user_id > uid_max) {
|
||||
for (user_id = uid_min; user_id <= uid_max; user_id++) {
|
||||
if (false == used_uids[user_id]) {
|
||||
break;
|
||||
|
||||
/*
|
||||
* If we get all the way through the loop, try again from UID_MAX,
|
||||
* unless that was where we previously started. (NOTE: the worst-case
|
||||
* scenario here is that we will run through (UID_MAX - UID_MIN - 1)
|
||||
* cycles *again* if we fall into this case with lowest_found as
|
||||
* UID_MAX - 1, all users in the range in use and maintained by
|
||||
* network services such as LDAP.)
|
||||
*/
|
||||
if (lowest_found != uid_max) {
|
||||
for (id = uid_max; id >= uid_min; id--) {
|
||||
result = check_uid (id, uid_min, uid_max, used_uids);
|
||||
if (result == 0) {
|
||||
/* This UID is available. Return it. */
|
||||
*uid = id;
|
||||
free (used_uids);
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This UID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique system UID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG((LOG_ERR,
|
||||
"Error checking available UIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later UID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
if (user_id > uid_max) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique UID (no more available UIDs)\n"),
|
||||
Prog);
|
||||
SYSLOG ((LOG_WARN, "no more available UID on the system"));
|
||||
}
|
||||
} else { /* !sys_user */
|
||||
/*
|
||||
* For non-system users, we want to start from the
|
||||
* bottom of the range and work upwards.
|
||||
*/
|
||||
|
||||
/*
|
||||
* At the conclusion of the pw_next() search, we will either
|
||||
* have a presumed-free UID or we will be at UID_MAX + 1.
|
||||
*/
|
||||
if (highest_found > uid_max) {
|
||||
/*
|
||||
* In this case, a UID is in use at UID_MAX.
|
||||
*
|
||||
* We will reset the search to UID_MIN and proceed up
|
||||
* through all the UIDs (skipping those we detected with
|
||||
* used_uids) for a free one. It is a known issue that
|
||||
* this may result in reusing a previously-deleted UID,
|
||||
* so administrators should be instructed to use this
|
||||
* auto-detection with care (and prefer to assign UIDs
|
||||
* explicitly).
|
||||
*/
|
||||
highest_found = uid_min;
|
||||
}
|
||||
|
||||
/* Search through all of the IDs in the range */
|
||||
for (id = highest_found; id <= uid_max; id++) {
|
||||
result = check_uid (id, uid_min, uid_max, used_uids);
|
||||
if (result == 0) {
|
||||
/* This UID is available. Return it. */
|
||||
*uid = id;
|
||||
free (used_uids);
|
||||
return -1;
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This UID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique UID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available UIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later UID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get all the way through the loop, try again from UID_MIN,
|
||||
* unless that was where we previously started. (NOTE: the worst-case
|
||||
* scenario here is that we will run through (UID_MAX - UID_MIN - 1)
|
||||
* cycles *again* if we fall into this case with highest_found as
|
||||
* UID_MIN + 1, all users in the range in use and maintained by
|
||||
* network services such as LDAP.)
|
||||
*/
|
||||
if (highest_found != uid_min) {
|
||||
for (id = uid_min; id <= uid_max; id++) {
|
||||
result = check_uid (id, uid_min, uid_max, used_uids);
|
||||
if (result == 0) {
|
||||
/* This UID is available. Return it. */
|
||||
*uid = id;
|
||||
free (used_uids);
|
||||
return 0;
|
||||
} else if (result == EEXIST) {
|
||||
/* This UID is in use, we'll continue to the next */
|
||||
} else {
|
||||
/*
|
||||
* An unexpected error occurred.
|
||||
*
|
||||
* Only report it the first time to avoid spamming
|
||||
* the logs
|
||||
*
|
||||
*/
|
||||
if (!nospam) {
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique UID (%s). "
|
||||
"Suppressing additional messages.\n"),
|
||||
Prog, strerror (result));
|
||||
SYSLOG ((LOG_ERR,
|
||||
"Error checking available UIDs: %s",
|
||||
strerror (result)));
|
||||
nospam = 1;
|
||||
}
|
||||
/*
|
||||
* We will continue anyway. Hopefully a later UID
|
||||
* will work properly.
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* The code reached here and found no available IDs in the range */
|
||||
fprintf (stderr,
|
||||
_("%s: Can't get unique UID (no more available UIDs)\n"),
|
||||
Prog);
|
||||
SYSLOG ((LOG_WARN, "no more available UIDs on the system"));
|
||||
free (used_uids);
|
||||
*uid = user_id;
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
#endif
|
||||
|
||||
/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
|
||||
as well as gratuitiously global symbol names, so we can have multiple
|
||||
as well as gratuitously global symbol names, so we can have multiple
|
||||
yacc generated parsers in the same program. Note that these are only
|
||||
the variables produced by yacc. If other parser generators (bison,
|
||||
byacc, etc) produce additional global names that conflict at link time,
|
||||
|
||||
89
libmisc/gettime.c
Normal file
89
libmisc/gettime.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Chris Lamb
|
||||
* 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. The name of the copyright holders or contributors may not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT
|
||||
* HOLDERS 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>
|
||||
|
||||
#ident "$Id$"
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
|
||||
/*
|
||||
* gettime() returns the time as the number of seconds since the Epoch
|
||||
*
|
||||
* Like time(), gettime() returns the time as the number of seconds since the
|
||||
* Epoch, 1970-01-01 00:00:00 +0000 (UTC), except that if the SOURCE_DATE_EPOCH
|
||||
* environment variable is exported it will use that instead.
|
||||
*/
|
||||
/*@observer@*/time_t gettime ()
|
||||
{
|
||||
char *endptr;
|
||||
char *source_date_epoch;
|
||||
time_t fallback;
|
||||
unsigned long long epoch;
|
||||
|
||||
fallback = time (NULL);
|
||||
source_date_epoch = shadow_getenv ("SOURCE_DATE_EPOCH");
|
||||
|
||||
if (!source_date_epoch)
|
||||
return fallback;
|
||||
|
||||
errno = 0;
|
||||
epoch = strtoull (source_date_epoch, &endptr, 10);
|
||||
if ((errno == ERANGE && (epoch == ULLONG_MAX || epoch == 0))
|
||||
|| (errno != 0 && epoch == 0)) {
|
||||
fprintf (stderr,
|
||||
_("Environment variable $SOURCE_DATE_EPOCH: strtoull: %s\n"),
|
||||
strerror(errno));
|
||||
} else if (endptr == source_date_epoch) {
|
||||
fprintf (stderr,
|
||||
_("Environment variable $SOURCE_DATE_EPOCH: No digits were found: %s\n"),
|
||||
endptr);
|
||||
} else if (*endptr != '\0') {
|
||||
fprintf (stderr,
|
||||
_("Environment variable $SOURCE_DATE_EPOCH: Trailing garbage: %s\n"),
|
||||
endptr);
|
||||
} else if (epoch > ULONG_MAX) {
|
||||
fprintf (stderr,
|
||||
_("Environment variable $SOURCE_DATE_EPOCH: value must be smaller than or equal to %lu but was found to be: %llu\n"),
|
||||
ULONG_MAX, epoch);
|
||||
} else if (epoch > fallback) {
|
||||
fprintf (stderr,
|
||||
_("Environment variable $SOURCE_DATE_EPOCH: value must be smaller than or equal to the current time (%lu) but was found to be: %llu\n"),
|
||||
fallback, epoch);
|
||||
} else {
|
||||
/* Valid */
|
||||
return (time_t)epoch;
|
||||
}
|
||||
|
||||
return fallback;
|
||||
}
|
||||
@@ -36,6 +36,10 @@
|
||||
#include <stdio.h>
|
||||
#include "prototypes.h"
|
||||
#include "idmapping.h"
|
||||
#include <sys/prctl.h>
|
||||
#if HAVE_SYS_CAPABILITY_H
|
||||
#include <sys/capability.h>
|
||||
#endif
|
||||
|
||||
struct map_range *get_map_ranges(int ranges, int argc, char **argv)
|
||||
{
|
||||
@@ -119,9 +123,23 @@ struct map_range *get_map_ranges(int ranges, int argc, char **argv)
|
||||
*/
|
||||
#define ULONG_DIGITS ((((sizeof(unsigned long) * CHAR_BIT) + 9)/10)*3)
|
||||
|
||||
|
||||
/*
|
||||
* The ruid refers to the caller's uid and is used to reset the effective uid
|
||||
* back to the callers real uid.
|
||||
* This clutch mainly exists for setuid-based new{g,u}idmap binaries that are
|
||||
* called in contexts where all capabilities other than the necessary
|
||||
* CAP_SET{G,U}ID capabilities are dropped. Since the kernel will require
|
||||
* assurance that the caller holds CAP_SYS_ADMIN over the target user namespace
|
||||
* the only way it can confirm is in this case is if the effective uid is
|
||||
* equivalent to the uid owning the target user namespace.
|
||||
* Note, we only support this when a) new{g,u}idmap is not called by root and
|
||||
* b) if the caller's uid and the uid retrieved via system appropriate means
|
||||
* (shadow file or other) are identical. Specifically, this does not support
|
||||
* when the root user calls the new{g,u}idmap binary for an unprivileged user.
|
||||
* If this is wanted: use file capabilities!
|
||||
*/
|
||||
void write_mapping(int proc_dir_fd, int ranges, struct map_range *mappings,
|
||||
const char *map_file)
|
||||
const char *map_file, uid_t ruid)
|
||||
{
|
||||
int idx;
|
||||
struct map_range *mapping;
|
||||
@@ -129,6 +147,43 @@ void write_mapping(int proc_dir_fd, int ranges, struct map_range *mappings,
|
||||
char *buf, *pos;
|
||||
int fd;
|
||||
|
||||
#if HAVE_SYS_CAPABILITY_H
|
||||
int cap;
|
||||
struct __user_cap_header_struct hdr = {_LINUX_CAPABILITY_VERSION_3, 0};
|
||||
struct __user_cap_data_struct data[2] = {{0}};
|
||||
|
||||
if (strcmp(map_file, "uid_map") == 0) {
|
||||
cap = CAP_SETUID;
|
||||
} else if (strcmp(map_file, "gid_map") == 0) {
|
||||
cap = CAP_SETGID;
|
||||
} else {
|
||||
fprintf(stderr, _("%s: Invalid map file %s specified\n"), Prog, map_file);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Align setuid- and fscaps-based new{g,u}idmap behavior. */
|
||||
if (geteuid() == 0 && geteuid() != ruid) {
|
||||
if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) < 0) {
|
||||
fprintf(stderr, _("%s: Could not prctl(PR_SET_KEEPCAPS)\n"), Prog);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (seteuid(ruid) < 0) {
|
||||
fprintf(stderr, _("%s: Could not seteuid to %d\n"), Prog, ruid);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Lockdown new{g,u}idmap by dropping all unneeded capabilities. */
|
||||
memset(data, 0, sizeof(data));
|
||||
data[0].effective = CAP_TO_MASK(cap);
|
||||
data[0].permitted = data[0].effective;
|
||||
if (capset(&hdr, data) < 0) {
|
||||
fprintf(stderr, _("%s: Could not set caps\n"), Prog);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
#endif
|
||||
|
||||
bufsize = ranges * ((ULONG_DIGITS + 1) * 3);
|
||||
pos = buf = xmalloc(bufsize);
|
||||
|
||||
@@ -148,7 +203,7 @@ void write_mapping(int proc_dir_fd, int ranges, struct map_range *mappings,
|
||||
pos += written;
|
||||
}
|
||||
|
||||
/* Write the mapping to the maping file */
|
||||
/* Write the mapping to the mapping file */
|
||||
fd = openat(proc_dir_fd, map_file, O_WRONLY);
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, _("%s: open of %s failed: %s\n"),
|
||||
|
||||
@@ -38,7 +38,7 @@ struct map_range {
|
||||
|
||||
extern struct map_range *get_map_ranges(int ranges, int argc, char **argv);
|
||||
extern void write_mapping(int proc_dir_fd, int ranges,
|
||||
struct map_range *mappings, const char *map_file);
|
||||
struct map_range *mappings, const char *map_file, uid_t ruid);
|
||||
|
||||
#endif /* _ID_MAPPING_H_ */
|
||||
|
||||
|
||||
@@ -268,6 +268,9 @@ static /*@observer@*//*@null@*/const char *obscure_msg (
|
||||
#ifdef USE_SHA_CRYPT
|
||||
|| (strcmp (result, "SHA256") == 0)
|
||||
|| (strcmp (result, "SHA512") == 0)
|
||||
#endif
|
||||
#ifdef USE_BCRYPT
|
||||
|| (strcmp (result, "BCRYPT") == 0)
|
||||
#endif
|
||||
) {
|
||||
return NULL;
|
||||
|
||||
@@ -134,7 +134,7 @@ failed_conversation:
|
||||
*
|
||||
* Return 0 on success, 1 on failure.
|
||||
*/
|
||||
int do_pam_passwd_non_interractive (const char *pam_service,
|
||||
int do_pam_passwd_non_interactive (const char *pam_service,
|
||||
const char *username,
|
||||
const char* password)
|
||||
{
|
||||
347
libmisc/prefix_flag.c
Normal file
347
libmisc/prefix_flag.c
Normal file
@@ -0,0 +1,347 @@
|
||||
/*
|
||||
* Copyright (c) 2011 , Julian Pidancet
|
||||
* Copyright (c) 2011 , Nicolas François
|
||||
* 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. The name of the copyright holders or contributors may not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT
|
||||
* HOLDERS 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>
|
||||
|
||||
#ident "$Id$"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
/*@-exitarg@*/
|
||||
#include "exitcodes.h"
|
||||
#include "groupio.h"
|
||||
#include "pwio.h"
|
||||
#ifdef SHADOWGRP
|
||||
#include "sgroupio.h"
|
||||
#endif
|
||||
#include "shadowio.h"
|
||||
#ifdef ENABLE_SUBIDS
|
||||
#include "subordinateio.h"
|
||||
#endif /* ENABLE_SUBIDS */
|
||||
#include "getdef.h"
|
||||
|
||||
static char *passwd_db_file = NULL;
|
||||
static char *spw_db_file = NULL;
|
||||
static char *group_db_file = NULL;
|
||||
static char *sgroup_db_file = NULL;
|
||||
static char *suid_db_file = NULL;
|
||||
static char *sgid_db_file = NULL;
|
||||
static char *def_conf_file = NULL;
|
||||
static FILE* fp_pwent = NULL;
|
||||
static FILE* fp_grent = NULL;
|
||||
|
||||
/*
|
||||
* process_prefix_flag - prefix all paths if given the --prefix option
|
||||
*
|
||||
* This shall be called before accessing the passwd, group, shadow,
|
||||
* gshadow, useradd's default, login.defs files (non exhaustive list)
|
||||
* or authenticating the caller.
|
||||
*
|
||||
* The audit, syslog, or locale files shall be open before
|
||||
*/
|
||||
extern const char* process_prefix_flag (const char* short_opt, int argc, char **argv)
|
||||
{
|
||||
/*
|
||||
* Parse the command line options.
|
||||
*/
|
||||
int i;
|
||||
const char *prefix = NULL;
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
if ( (strcmp (argv[i], "--prefix") == 0)
|
||||
|| (strcmp (argv[i], short_opt) == 0)) {
|
||||
if (NULL != prefix) {
|
||||
fprintf (stderr,
|
||||
_("%s: multiple --prefix options\n"),
|
||||
Prog);
|
||||
exit (E_BAD_ARG);
|
||||
}
|
||||
|
||||
if (i + 1 == argc) {
|
||||
fprintf (stderr,
|
||||
_("%s: option '%s' requires an argument\n"),
|
||||
Prog, argv[i]);
|
||||
exit (E_BAD_ARG);
|
||||
}
|
||||
prefix = argv[i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (prefix != NULL) {
|
||||
if ( prefix[0] == '\0' || !strcmp(prefix, "/"))
|
||||
return ""; /* if prefix is "/" then we ignore the flag option */
|
||||
/* should we prevent symbolic link from being used as a prefix? */
|
||||
|
||||
size_t len;
|
||||
len = strlen(prefix) + strlen(PASSWD_FILE) + 2;
|
||||
passwd_db_file = xmalloc(len);
|
||||
snprintf(passwd_db_file, len, "%s/%s", prefix, PASSWD_FILE);
|
||||
pw_setdbname(passwd_db_file);
|
||||
|
||||
len = strlen(prefix) + strlen(GROUP_FILE) + 2;
|
||||
group_db_file = xmalloc(len);
|
||||
snprintf(group_db_file, len, "%s/%s", prefix, GROUP_FILE);
|
||||
gr_setdbname(group_db_file);
|
||||
|
||||
#ifdef SHADOWGRP
|
||||
len = strlen(prefix) + strlen(SGROUP_FILE) + 2;
|
||||
sgroup_db_file = xmalloc(len);
|
||||
snprintf(sgroup_db_file, len, "%s/%s", prefix, SGROUP_FILE);
|
||||
sgr_setdbname(sgroup_db_file);
|
||||
#endif
|
||||
#ifdef USE_NIS
|
||||
__setspNIS(0); /* disable NIS for now, at least until it is properly supporting a "prefix" */
|
||||
#endif
|
||||
|
||||
len = strlen(prefix) + strlen(SHADOW_FILE) + 2;
|
||||
spw_db_file = xmalloc(len);
|
||||
snprintf(spw_db_file, len, "%s/%s", prefix, SHADOW_FILE);
|
||||
spw_setdbname(spw_db_file);
|
||||
|
||||
#ifdef ENABLE_SUBIDS
|
||||
len = strlen(prefix) + strlen("/etc/subuid") + 2;
|
||||
suid_db_file = xmalloc(len);
|
||||
snprintf(suid_db_file, len, "%s/%s", prefix, "/etc/subuid");
|
||||
sub_uid_setdbname(suid_db_file);
|
||||
|
||||
len = strlen(prefix) + strlen("/etc/subgid") + 2;
|
||||
sgid_db_file = xmalloc(len);
|
||||
snprintf(sgid_db_file, len, "%s/%s", prefix, "/etc/subgid");
|
||||
sub_gid_setdbname(sgid_db_file);
|
||||
#endif
|
||||
|
||||
#ifdef USE_ECONF
|
||||
setdef_config_file(prefix);
|
||||
#else
|
||||
len = strlen(prefix) + strlen("/etc/login.defs") + 2;
|
||||
def_conf_file = xmalloc(len);
|
||||
snprintf(def_conf_file, len, "%s/%s", prefix, "/etc/login.defs");
|
||||
setdef_config_file(def_conf_file);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (prefix == NULL)
|
||||
return "";
|
||||
return prefix;
|
||||
}
|
||||
|
||||
|
||||
extern struct group *prefix_getgrnam(const char *name)
|
||||
{
|
||||
if (group_db_file) {
|
||||
FILE* fg;
|
||||
struct group * grp = NULL;
|
||||
|
||||
fg = fopen(group_db_file, "rt");
|
||||
if(!fg)
|
||||
return NULL;
|
||||
while((grp = fgetgrent(fg)) != NULL) {
|
||||
if(!strcmp(name, grp->gr_name))
|
||||
break;
|
||||
}
|
||||
fclose(fg);
|
||||
return grp;
|
||||
}
|
||||
|
||||
return getgrnam(name);
|
||||
}
|
||||
|
||||
extern struct group *prefix_getgrgid(gid_t gid)
|
||||
{
|
||||
if (group_db_file) {
|
||||
FILE* fg;
|
||||
struct group * grp = NULL;
|
||||
|
||||
fg = fopen(group_db_file, "rt");
|
||||
if(!fg)
|
||||
return NULL;
|
||||
while((grp = fgetgrent(fg)) != NULL) {
|
||||
if(gid == grp->gr_gid)
|
||||
break;
|
||||
}
|
||||
fclose(fg);
|
||||
return grp;
|
||||
}
|
||||
|
||||
return getgrgid(gid);
|
||||
}
|
||||
|
||||
extern struct passwd *prefix_getpwuid(uid_t uid)
|
||||
{
|
||||
if (passwd_db_file) {
|
||||
FILE* fg;
|
||||
struct passwd *pwd = NULL;
|
||||
|
||||
fg = fopen(passwd_db_file, "rt");
|
||||
if(!fg)
|
||||
return NULL;
|
||||
while((pwd = fgetpwent(fg)) != NULL) {
|
||||
if(uid == pwd->pw_uid)
|
||||
break;
|
||||
}
|
||||
fclose(fg);
|
||||
return pwd;
|
||||
}
|
||||
else {
|
||||
return getpwuid(uid);
|
||||
}
|
||||
}
|
||||
extern struct passwd *prefix_getpwnam(const char* name)
|
||||
{
|
||||
if (passwd_db_file) {
|
||||
FILE* fg;
|
||||
struct passwd *pwd = NULL;
|
||||
|
||||
fg = fopen(passwd_db_file, "rt");
|
||||
if(!fg)
|
||||
return NULL;
|
||||
while((pwd = fgetpwent(fg)) != NULL) {
|
||||
if(!strcmp(name, pwd->pw_name))
|
||||
break;
|
||||
}
|
||||
fclose(fg);
|
||||
return pwd;
|
||||
}
|
||||
else {
|
||||
return getpwnam(name);
|
||||
}
|
||||
}
|
||||
extern struct spwd *prefix_getspnam(const char* name)
|
||||
{
|
||||
if (spw_db_file) {
|
||||
FILE* fg;
|
||||
struct spwd *sp = NULL;
|
||||
|
||||
fg = fopen(spw_db_file, "rt");
|
||||
if(!fg)
|
||||
return NULL;
|
||||
while((sp = fgetspent(fg)) != NULL) {
|
||||
if(!strcmp(name, sp->sp_namp))
|
||||
break;
|
||||
}
|
||||
fclose(fg);
|
||||
return sp;
|
||||
}
|
||||
else {
|
||||
return getspnam(name);
|
||||
}
|
||||
}
|
||||
|
||||
extern void prefix_setpwent()
|
||||
{
|
||||
if(!passwd_db_file) {
|
||||
setpwent();
|
||||
return;
|
||||
}
|
||||
if (fp_pwent)
|
||||
fclose (fp_pwent);
|
||||
|
||||
fp_pwent = fopen(passwd_db_file, "rt");
|
||||
if(!fp_pwent)
|
||||
return;
|
||||
}
|
||||
extern struct passwd* prefix_getpwent()
|
||||
{
|
||||
if(!passwd_db_file) {
|
||||
return getpwent();
|
||||
}
|
||||
return fgetpwent(fp_pwent);
|
||||
}
|
||||
extern void prefix_endpwent()
|
||||
{
|
||||
if(!passwd_db_file) {
|
||||
endpwent();
|
||||
return;
|
||||
}
|
||||
if (fp_pwent)
|
||||
fclose(fp_pwent);
|
||||
fp_pwent = NULL;
|
||||
}
|
||||
|
||||
extern void prefix_setgrent()
|
||||
{
|
||||
if(!group_db_file) {
|
||||
setgrent();
|
||||
return;
|
||||
}
|
||||
if (fp_grent)
|
||||
fclose (fp_grent);
|
||||
|
||||
fp_grent = fopen(group_db_file, "rt");
|
||||
if(!fp_grent)
|
||||
return;
|
||||
}
|
||||
extern struct group* prefix_getgrent()
|
||||
{
|
||||
if(!group_db_file) {
|
||||
return getgrent();
|
||||
}
|
||||
return fgetgrent(fp_grent);
|
||||
}
|
||||
extern void prefix_endgrent()
|
||||
{
|
||||
if(!group_db_file) {
|
||||
endgrent();
|
||||
return;
|
||||
}
|
||||
if (fp_grent)
|
||||
fclose(fp_grent);
|
||||
fp_grent = NULL;
|
||||
}
|
||||
|
||||
extern struct group *prefix_getgr_nam_gid(const char *grname)
|
||||
{
|
||||
long long int gid;
|
||||
char *endptr;
|
||||
struct group *g;
|
||||
|
||||
if (NULL == grname) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (group_db_file) {
|
||||
errno = 0;
|
||||
gid = strtoll (grname, &endptr, 10);
|
||||
if ( ('\0' != *grname)
|
||||
&& ('\0' == *endptr)
|
||||
&& (ERANGE != errno)
|
||||
&& (gid == (gid_t)gid)) {
|
||||
return prefix_getgrgid ((gid_t) gid);
|
||||
}
|
||||
g = prefix_getgrnam (grname);
|
||||
return g ? __gr_dup(g) : NULL;
|
||||
}
|
||||
else
|
||||
return getgr_nam_gid(grname);
|
||||
}
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "prototypes.h"
|
||||
#include "defines.h"
|
||||
#include <pwd.h>
|
||||
extern time_t time (time_t *);
|
||||
|
||||
/*
|
||||
* pwd_to_spwd - create entries for new spwd structure
|
||||
@@ -66,7 +65,7 @@ struct spwd *pwd_to_spwd (const struct passwd *pw)
|
||||
*/
|
||||
sp.sp_min = 0;
|
||||
sp.sp_max = (10000L * DAY) / SCALE;
|
||||
sp.sp_lstchg = (long) time ((time_t *) 0) / SCALE;
|
||||
sp.sp_lstchg = (long) gettime () / SCALE;
|
||||
if (0 == sp.sp_lstchg) {
|
||||
/* Better disable aging than requiring a password
|
||||
* change */
|
||||
|
||||
123
libmisc/salt.c
123
libmisc/salt.c
@@ -22,10 +22,16 @@
|
||||
/* local function prototypes */
|
||||
static void seedRNG (void);
|
||||
static /*@observer@*/const char *gensalt (size_t salt_size);
|
||||
#ifdef USE_SHA_CRYPT
|
||||
#if defined(USE_SHA_CRYPT) || defined(USE_BCRYPT)
|
||||
static long shadow_random (long min, long max);
|
||||
#endif /* USE_SHA_CRYPT || USE_BCRYPT */
|
||||
#ifdef USE_SHA_CRYPT
|
||||
static /*@observer@*/const char *SHA_salt_rounds (/*@null@*/int *prefered_rounds);
|
||||
#endif /* USE_SHA_CRYPT */
|
||||
#ifdef USE_BCRYPT
|
||||
static /*@observer@*/const char *gensalt_bcrypt (void);
|
||||
static /*@observer@*/const char *BCRYPT_salt_rounds (/*@null@*/int *prefered_rounds);
|
||||
#endif /* USE_BCRYPT */
|
||||
|
||||
#ifndef HAVE_L64A
|
||||
static /*@observer@*/char *l64a(long value)
|
||||
@@ -79,8 +85,16 @@ static void seedRNG (void)
|
||||
* Add the salt prefix.
|
||||
*/
|
||||
#define MAGNUM(array,ch) (array)[0]=(array)[2]='$',(array)[1]=(ch),(array)[3]='\0'
|
||||
#ifdef USE_BCRYPT
|
||||
/*
|
||||
* Using the Prefix $2a$ to enable an anti-collision safety measure in musl libc.
|
||||
* Negatively affects a subset of passwords containing the '\xff' character,
|
||||
* which is not valid UTF-8 (so "unlikely to cause much annoyance").
|
||||
*/
|
||||
#define BCRYPTMAGNUM(array) (array)[0]=(array)[3]='$',(array)[1]='2',(array)[2]='a',(array)[4]='\0'
|
||||
#endif /* USE_BCRYPT */
|
||||
|
||||
#ifdef USE_SHA_CRYPT
|
||||
#if defined(USE_SHA_CRYPT) || defined(USE_BCRYPT)
|
||||
/* It is not clear what is the maximum value of random().
|
||||
* We assume 2^31-1.*/
|
||||
#define RANDOM_MAX 0x7FFFFFFF
|
||||
@@ -105,14 +119,15 @@ static long shadow_random (long min, long max)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif /* USE_SHA_CRYPT || USE_BCRYPT */
|
||||
|
||||
#ifdef USE_SHA_CRYPT
|
||||
/* Default number of rounds if not explicitly specified. */
|
||||
#define ROUNDS_DEFAULT 5000
|
||||
/* Minimum number of rounds. */
|
||||
#define ROUNDS_MIN 1000
|
||||
/* Maximum number of rounds. */
|
||||
#define ROUNDS_MAX 999999999
|
||||
|
||||
/*
|
||||
* Return a salt prefix specifying the rounds number for the SHA crypt methods.
|
||||
*/
|
||||
@@ -165,6 +180,89 @@ static /*@observer@*/const char *SHA_salt_rounds (/*@null@*/int *prefered_rounds
|
||||
}
|
||||
#endif /* USE_SHA_CRYPT */
|
||||
|
||||
#ifdef USE_BCRYPT
|
||||
/* Default number of rounds if not explicitly specified. */
|
||||
#define B_ROUNDS_DEFAULT 13
|
||||
/* Minimum number of rounds. */
|
||||
#define B_ROUNDS_MIN 4
|
||||
/* Maximum number of rounds. */
|
||||
#define B_ROUNDS_MAX 31
|
||||
/*
|
||||
* Return a salt prefix specifying the rounds number for the BCRYPT method.
|
||||
*/
|
||||
static /*@observer@*/const char *BCRYPT_salt_rounds (/*@null@*/int *prefered_rounds)
|
||||
{
|
||||
static char rounds_prefix[4]; /* Max size: 31$ */
|
||||
long rounds;
|
||||
|
||||
if (NULL == prefered_rounds) {
|
||||
long min_rounds = getdef_long ("BCRYPT_MIN_ROUNDS", -1);
|
||||
long max_rounds = getdef_long ("BCRYPT_MAX_ROUNDS", -1);
|
||||
|
||||
if (((-1 == min_rounds) && (-1 == max_rounds)) || (0 == *prefered_rounds)) {
|
||||
rounds = B_ROUNDS_DEFAULT;
|
||||
}
|
||||
else {
|
||||
if (-1 == min_rounds) {
|
||||
min_rounds = max_rounds;
|
||||
}
|
||||
|
||||
if (-1 == max_rounds) {
|
||||
max_rounds = min_rounds;
|
||||
}
|
||||
|
||||
if (min_rounds > max_rounds) {
|
||||
max_rounds = min_rounds;
|
||||
}
|
||||
|
||||
rounds = shadow_random (min_rounds, max_rounds);
|
||||
}
|
||||
} else {
|
||||
rounds = *prefered_rounds;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sanity checks.
|
||||
* Use 19 as an upper bound for now,
|
||||
* because musl doesn't allow rounds >= 20.
|
||||
*/
|
||||
if (rounds < B_ROUNDS_MIN) {
|
||||
rounds = B_ROUNDS_MIN;
|
||||
}
|
||||
|
||||
if (rounds > 19) {
|
||||
/* rounds = B_ROUNDS_MAX; */
|
||||
rounds = 19;
|
||||
}
|
||||
|
||||
(void) snprintf (rounds_prefix, sizeof rounds_prefix,
|
||||
"%2.2ld$", rounds);
|
||||
|
||||
return rounds_prefix;
|
||||
}
|
||||
|
||||
#define BCRYPT_SALT_SIZE 22
|
||||
/*
|
||||
* Generate a 22 character salt string for bcrypt.
|
||||
*/
|
||||
static /*@observer@*/const char *gensalt_bcrypt (void)
|
||||
{
|
||||
static char salt[32];
|
||||
|
||||
salt[0] = '\0';
|
||||
|
||||
seedRNG ();
|
||||
strcat (salt, l64a (random()));
|
||||
do {
|
||||
strcat (salt, l64a (random()));
|
||||
} while (strlen (salt) < BCRYPT_SALT_SIZE);
|
||||
|
||||
salt[BCRYPT_SALT_SIZE] = '\0';
|
||||
|
||||
return salt;
|
||||
}
|
||||
#endif /* USE_BCRYPT */
|
||||
|
||||
/*
|
||||
* Generate salt of size salt_size.
|
||||
*/
|
||||
@@ -230,6 +328,11 @@ static /*@observer@*/const char *gensalt (size_t salt_size)
|
||||
|
||||
if (0 == strcmp (method, "MD5")) {
|
||||
MAGNUM(result, '1');
|
||||
#ifdef USE_BCRYPT
|
||||
} else if (0 == strcmp (method, "BCRYPT")) {
|
||||
BCRYPTMAGNUM(result);
|
||||
strcat(result, BCRYPT_salt_rounds((int *)arg));
|
||||
#endif /* USE_BCRYPT */
|
||||
#ifdef USE_SHA_CRYPT
|
||||
} else if (0 == strcmp (method, "SHA256")) {
|
||||
MAGNUM(result, '5');
|
||||
@@ -252,8 +355,18 @@ static /*@observer@*/const char *gensalt (size_t salt_size)
|
||||
* Concatenate a pseudo random salt.
|
||||
*/
|
||||
assert (sizeof (result) > strlen (result) + salt_len);
|
||||
strncat (result, gensalt (salt_len),
|
||||
sizeof (result) - strlen (result) - 1);
|
||||
#ifdef USE_BCRYPT
|
||||
if (0 == strcmp (method, "BCRYPT")) {
|
||||
strncat (result, gensalt_bcrypt (),
|
||||
sizeof (result) - strlen (result) - 1);
|
||||
return result;
|
||||
} else {
|
||||
#endif /* USE_BCRYPT */
|
||||
strncat (result, gensalt (salt_len),
|
||||
sizeof (result) - strlen (result) - 1);
|
||||
#ifdef USE_BCRYPT
|
||||
}
|
||||
#endif /* USE_BCRYPT */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ static void read_env_file (const char *filename)
|
||||
cp++;
|
||||
goto d_quote;
|
||||
}
|
||||
eise if (*cp == '\0') {
|
||||
else if (*cp == '\0') {
|
||||
/* end of string */
|
||||
goto finished;
|
||||
} else {
|
||||
|
||||
@@ -126,7 +126,7 @@ static char *date_formats[] = {
|
||||
#else
|
||||
/*
|
||||
* days and juldays are used to compute the number of days in the
|
||||
* current month, and the cummulative number of days in the preceding
|
||||
* current month, and the cumulative number of days in the preceding
|
||||
* months. they are declared so that january is 1, not 0.
|
||||
*/
|
||||
static short days[13] = { 0,
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
#ifdef ENABLE_SUBIDS
|
||||
@@ -106,6 +107,31 @@ static int user_busy_utmp (const char *name)
|
||||
#endif /* !__linux__ */
|
||||
|
||||
#ifdef __linux__
|
||||
#ifdef ENABLE_SUBIDS
|
||||
#define in_parentuid_range(uid) ((uid) >= parentuid && (uid) < parentuid + range)
|
||||
static int different_namespace (const char *sname)
|
||||
{
|
||||
/* 41: /proc/xxxxxxxxxx/task/xxxxxxxxxx/ns/user + \0 */
|
||||
char path[41];
|
||||
char buf[512], buf2[512];
|
||||
ssize_t llen1, llen2;
|
||||
|
||||
snprintf (path, 41, "/proc/%s/ns/user", sname);
|
||||
|
||||
if ((llen1 = readlink (path, buf, sizeof(buf))) == -1)
|
||||
return 0;
|
||||
|
||||
if ((llen2 = readlink ("/proc/self/ns/user", buf2, sizeof(buf2))) == -1)
|
||||
return 0;
|
||||
|
||||
if (llen1 == llen2 && memcmp (buf, buf2, llen1) == 0)
|
||||
return 0; /* same namespace */
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif /* ENABLE_SUBIDS */
|
||||
|
||||
|
||||
static int check_status (const char *name, const char *sname, uid_t uid)
|
||||
{
|
||||
/* 40: /proc/xxxxxxxxxx/task/xxxxxxxxxx/status + \0 */
|
||||
@@ -114,7 +140,6 @@ static int check_status (const char *name, const char *sname, uid_t uid)
|
||||
FILE *sfile;
|
||||
|
||||
snprintf (status, 40, "/proc/%s/status", sname);
|
||||
status[39] = '\0';
|
||||
|
||||
sfile = fopen (status, "r");
|
||||
if (NULL == sfile) {
|
||||
@@ -123,26 +148,29 @@ static int check_status (const char *name, const char *sname, uid_t uid)
|
||||
while (fgets (line, sizeof (line), sfile) == line) {
|
||||
if (strncmp (line, "Uid:\t", 5) == 0) {
|
||||
unsigned long ruid, euid, suid;
|
||||
|
||||
assert (uid == (unsigned long) uid);
|
||||
(void) fclose (sfile);
|
||||
if (sscanf (line,
|
||||
"Uid:\t%lu\t%lu\t%lu\n",
|
||||
&ruid, &euid, &suid) == 3) {
|
||||
if ( (ruid == (unsigned long) uid)
|
||||
|| (euid == (unsigned long) uid)
|
||||
|| (suid == (unsigned long) uid)
|
||||
#ifdef ENABLE_SUBIDS
|
||||
|| have_sub_uids(name, ruid, 1)
|
||||
|| have_sub_uids(name, euid, 1)
|
||||
|| have_sub_uids(name, suid, 1)
|
||||
#endif /* ENABLE_SUBIDS */
|
||||
) {
|
||||
(void) fclose (sfile);
|
||||
|| (suid == (unsigned long) uid) ) {
|
||||
return 1;
|
||||
}
|
||||
#ifdef ENABLE_SUBIDS
|
||||
if ( different_namespace (sname)
|
||||
&& ( have_sub_uids(name, ruid, 1)
|
||||
|| have_sub_uids(name, euid, 1)
|
||||
|| have_sub_uids(name, suid, 1))
|
||||
) {
|
||||
return 1;
|
||||
}
|
||||
#endif /* ENABLE_SUBIDS */
|
||||
} else {
|
||||
/* Ignore errors. This is just a best effort. */
|
||||
}
|
||||
(void) fclose (sfile);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -170,6 +198,9 @@ static int user_busy_processes (const char *name, uid_t uid)
|
||||
proc = opendir ("/proc");
|
||||
if (proc == NULL) {
|
||||
perror ("opendir /proc");
|
||||
#ifdef ENABLE_SUBIDS
|
||||
sub_uid_close();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
if (stat ("/", &sbroot) != 0) {
|
||||
|
||||
@@ -35,10 +35,10 @@
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
|
||||
#include <utmp.h>
|
||||
|
||||
#ifdef USE_UTMPX
|
||||
#include <utmpx.h>
|
||||
#else
|
||||
#include <utmp.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
@@ -88,7 +88,7 @@ static bool is_my_tty (const char *tty)
|
||||
* session
|
||||
*
|
||||
* The utmp file is scanned for an entry with the same process ID.
|
||||
* The line enterred by the *getty / telnetd, etc. should also match
|
||||
* The line entered by the *getty / telnetd, etc. should also match
|
||||
* the current terminal.
|
||||
*
|
||||
* When an entry is returned by get_current_utmp, and if the utmp
|
||||
@@ -97,6 +97,7 @@ static bool is_my_tty (const char *tty)
|
||||
*
|
||||
* Return NULL if no entries exist in utmp for the current process.
|
||||
*/
|
||||
#ifndef USE_UTMPX
|
||||
/*@null@*/ /*@only@*/struct utmp *get_current_utmp (void)
|
||||
{
|
||||
struct utmp *ut;
|
||||
@@ -130,6 +131,36 @@ static bool is_my_tty (const char *tty)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
/*@null@*/ /*@only*/struct utmpx *get_current_utmp(void)
|
||||
{
|
||||
struct utmpx *ut;
|
||||
struct utmpx *ret = NULL;
|
||||
|
||||
setutxent ();
|
||||
|
||||
/* Find the utmpx entry for this PID. */
|
||||
while ((ut = getutxent ()) != NULL) {
|
||||
if ( (ut->ut_pid == getpid ())
|
||||
&& ('\0' != ut->ut_id[0])
|
||||
&& ( (LOGIN_PROCESS == ut->ut_type)
|
||||
|| (USER_PROCESS == ut->ut_type))
|
||||
&& is_my_tty (ut->ut_line)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL != ut) {
|
||||
ret = (struct utmpx *) xmalloc (sizeof (*ret));
|
||||
memcpy (ret, ut, sizeof (*ret));
|
||||
}
|
||||
|
||||
endutxent ();
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef USE_PAM
|
||||
/*
|
||||
@@ -166,6 +197,7 @@ static void updwtmpx (const char *filename, const struct utmpx *utx)
|
||||
#endif /* ! USE_PAM */
|
||||
|
||||
|
||||
#ifndef USE_UTMPX
|
||||
/*
|
||||
* prepare_utmp - prepare an utmp entry so that it can be logged in a
|
||||
* utmp/wtmp file.
|
||||
@@ -325,14 +357,14 @@ int setutmp (struct utmp *ut)
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef USE_UTMPX
|
||||
#else
|
||||
/*
|
||||
* prepare_utmpx - the UTMPX version for prepare_utmp
|
||||
*/
|
||||
/*@only@*/struct utmpx *prepare_utmpx (const char *name,
|
||||
const char *line,
|
||||
const char *host,
|
||||
/*@null@*/const struct utmp *ut)
|
||||
/*@null@*/const struct utmpx *ut)
|
||||
{
|
||||
struct timeval tv;
|
||||
char *hostname = NULL;
|
||||
@@ -398,7 +430,7 @@ int setutmp (struct utmp *ut)
|
||||
struct sockaddr_in *sa =
|
||||
(struct sockaddr_in *) info->ai_addr;
|
||||
#ifdef HAVE_STRUCT_UTMPX_UT_ADDR
|
||||
memcpy (utxent->ut_addr,
|
||||
memcpy (&utxent->ut_addr,
|
||||
&(sa->sin_addr),
|
||||
MIN (sizeof (utxent->ut_addr),
|
||||
sizeof (sa->sin_addr)));
|
||||
|
||||
@@ -41,7 +41,6 @@ man_MANS = \
|
||||
man1/sg.1 \
|
||||
man3/shadow.3 \
|
||||
man5/shadow.5 \
|
||||
man1/su.1 \
|
||||
man5/suauth.5 \
|
||||
man8/useradd.8 \
|
||||
man8/userdel.8 \
|
||||
@@ -54,6 +53,10 @@ man_nopam = \
|
||||
man5/login.access.5 \
|
||||
man5/porttime.5
|
||||
|
||||
if WITH_SU
|
||||
man_MANS += man1/su.1
|
||||
endif
|
||||
|
||||
if !USE_PAM
|
||||
man_MANS += $(man_nopam)
|
||||
endif
|
||||
@@ -137,6 +140,7 @@ login_defs_v = \
|
||||
ISSUE_FILE.xml \
|
||||
KILLCHAR.xml \
|
||||
LASTLOG_ENAB.xml \
|
||||
LASTLOG_UID_MAX.xml \
|
||||
LOGIN_RETRIES.xml \
|
||||
LOGIN_STRING.xml \
|
||||
LOGIN_TIMEOUT.xml \
|
||||
@@ -215,5 +219,4 @@ $(man_MANS):
|
||||
@echo "Error: you need to run configure with '--enable-man'"
|
||||
@echo " in order to regenerate man pages."
|
||||
@echo ""
|
||||
@false
|
||||
endif
|
||||
|
||||
10
man/README.md
Normal file
10
man/README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
The [official releases](https://github.com/shadow-maint/shadow/releases) ship
|
||||
with pre-built manpages.
|
||||
|
||||
The content of the man pages however is dependent on compile flags. So the
|
||||
pre-built ones might not fit your version of shadow. To build them yourself use
|
||||
`--enable-man`. Furthermore the following build requirements will be needed:
|
||||
- xsltproc
|
||||
- docbook 4
|
||||
- docbook stylesheets
|
||||
- itstool
|
||||
@@ -83,7 +83,7 @@
|
||||
The <command>chage</command> command changes the number of days between
|
||||
password changes and the date of the last password change. This
|
||||
information is used by the system to determine when a user must change
|
||||
his/her password.
|
||||
their password.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
@@ -131,6 +131,12 @@
|
||||
<para>Display help message and exit.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>-i</option>, <option>--iso8601</option></term>
|
||||
<listitem>
|
||||
<para>When printing dates, use YYYY-MM-DD format.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-I</option>, <option>--inactive</option> <replaceable>INACTIVE</replaceable>
|
||||
@@ -168,7 +174,7 @@
|
||||
<para>
|
||||
Set the minimum number of days between password changes to
|
||||
<replaceable>MIN_DAYS</replaceable>. A value of zero for this field
|
||||
indicates that the user may change his/her password at any time.
|
||||
indicates that the user may change their password at any time.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -181,8 +187,8 @@
|
||||
Set the maximum number of days during which a password is valid.
|
||||
When <replaceable>MAX_DAYS</replaceable> plus
|
||||
<replaceable>LAST_DAY</replaceable> is less than the current
|
||||
day, the user will be required to change his/her password before
|
||||
being able to use his/her account. This occurrence can be planned for
|
||||
day, the user will be required to change their password before
|
||||
being able to use their account. This occurrence can be planned for
|
||||
in advance by use of the <option>-W</option> option, which
|
||||
provides the user with advance warning.
|
||||
</para>
|
||||
@@ -214,7 +220,7 @@
|
||||
Set the number of days of warning before a password change is
|
||||
required. The <replaceable>WARN_DAYS</replaceable> option is the
|
||||
number of days prior to the password expiring that a user will
|
||||
be warned his/her password is about to expire.
|
||||
be warned their password is about to expire.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -235,7 +241,7 @@
|
||||
</para>
|
||||
<para>The <command>chage</command> command is restricted to the root
|
||||
user, except for the <option>-l</option> option, which may be used by
|
||||
an unprivileged user to determine when his/her password or account is due
|
||||
an unprivileged user to determine when their password or account is due
|
||||
to expire.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
@@ -46,7 +46,7 @@ Vypíše seznam členů skupiny.
|
||||
Příkaz
|
||||
\fBgroupmems\fR
|
||||
by měl mít nastavena práva
|
||||
2770
|
||||
2710
|
||||
a měl by jej vlastnit uživatel
|
||||
\fIroot\fR
|
||||
a skupina
|
||||
@@ -58,7 +58,7 @@ spravovat členství ve skupinách.
|
||||
.sp
|
||||
.nf
|
||||
$ groupadd \-r groups
|
||||
$ chmod 2770 groupmems
|
||||
$ chmod 2710 groupmems
|
||||
$ chown root.groups groupmems
|
||||
$ groupmems \-g groups \-a gk4
|
||||
|
||||
|
||||
@@ -42,12 +42,11 @@ man1/% man3/% man5/% man8/%: %.xml-config Makefile config.xml
|
||||
-nonet http://docbook.sourceforge.net/release/xsl/current/manpages/profile-docbook.xsl $<
|
||||
|
||||
clean-local:
|
||||
for d in man1 man3 man5 man8; do [ -d $$d ] && rmdir $$d; done
|
||||
rm -rf man1 man3 man5 man8
|
||||
|
||||
else
|
||||
$(man_MANS):
|
||||
@echo you need to run configure with --enable-man to generate man pages
|
||||
@false
|
||||
endif
|
||||
|
||||
man8/grpconv.8 man8/grpunconv.8 man8/pwunconv.8: man8/pwconv.8
|
||||
|
||||
@@ -5,8 +5,19 @@ config.xml: ../config.xml.in
|
||||
$(MAKE) -C .. config.xml
|
||||
cp ../config.xml $@
|
||||
|
||||
%.xml: ../%.xml ../po/$(LANG).po
|
||||
xml2po --expand-all-entities -l $(LANG) -p ../po/$(LANG).po -o $@ ../$@
|
||||
messages.mo: ../po/$(LANG).po
|
||||
msgfmt ../po/$(LANG).po -o messages.mo
|
||||
|
||||
login.defs.d:
|
||||
ln -sf ../login.defs.d login.defs.d
|
||||
|
||||
%.xml: ../%.xml messages.mo login.defs.d
|
||||
if grep -q SHADOW-CONFIG-HERE $< ; then \
|
||||
sed -e 's/^<!-- SHADOW-CONFIG-HERE -->/<!ENTITY % config SYSTEM "config.xml">%config;/' $< > $@; \
|
||||
else \
|
||||
sed -e 's/^\(<!DOCTYPE .*docbookx.dtd"\)>/\1 [<!ENTITY % config SYSTEM "config.xml">%config;]>/' $< > $@; \
|
||||
fi
|
||||
itstool -d -l $(LANG) -m messages.mo -o . $@
|
||||
sed -i 's:\(^<refentry .*\)>:\1 lang="$(LANG)">:' $@
|
||||
|
||||
include ../generate_mans.mak
|
||||
@@ -14,7 +25,6 @@ include ../generate_mans.mak
|
||||
else
|
||||
$(man_MANS):
|
||||
@echo you need to run configure with --enable-man to generate man pages
|
||||
@false
|
||||
endif
|
||||
|
||||
CLEANFILES = .xml2po.mo $(EXTRA_DIST) $(addsuffix .xml,$(EXTRA_DIST)) config.xml
|
||||
CLEANFILES = messages.mo login.defs.d $(EXTRA_DIST) $(addsuffix .xml,$(EXTRA_DIST)) config.xml
|
||||
|
||||
@@ -212,6 +212,23 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-P</option>, <option>--prefix</option> <replaceable>PREFIX_DIR</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Apply changes in the <replaceable>PREFIX_DIR</replaceable>
|
||||
directory and use the configuration files from the
|
||||
<replaceable>PREFIX_DIR</replaceable> directory.
|
||||
This option does not chroot and is intended for preparing
|
||||
a cross-compilation target.
|
||||
Some limitations: NIS and LDAP users/groups are not verified.
|
||||
PAM authentication is using the host files.
|
||||
No SELINUX support.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
|
||||
@@ -109,6 +109,23 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-P</option>, <option>--prefix</option> <replaceable>PREFIX_DIR</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Apply changes in the <replaceable>PREFIX_DIR</replaceable>
|
||||
directory and use the configuration files from the
|
||||
<replaceable>PREFIX_DIR</replaceable> directory.
|
||||
This option does not chroot and is intended for preparing
|
||||
a cross-compilation target.
|
||||
Some limitations: NIS and LDAP users/groups are not verified.
|
||||
PAM authentication is using the host files.
|
||||
No SELINUX support.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
<title>DESCRIPTION</title>
|
||||
<para>
|
||||
The <command>groupmems</command> command allows a user to administer
|
||||
his/her own group membership list without the requirement of
|
||||
their own group membership list without the requirement of
|
||||
superuser privileges. The <command>groupmems</command> utility is for
|
||||
systems that configure its users to be in their own name sake primary
|
||||
group (i.e., guest / guest).
|
||||
@@ -180,7 +180,7 @@
|
||||
<title>SETUP</title>
|
||||
<para>
|
||||
The <command>groupmems</command> executable should be in mode
|
||||
<literal>2770</literal> as user <emphasis>root</emphasis> and in group
|
||||
<literal>2710</literal> as user <emphasis>root</emphasis> and in group
|
||||
<emphasis>groups</emphasis>. The system administrator can add users to
|
||||
group <emphasis>groups</emphasis> to allow or disallow them using the
|
||||
<command>groupmems</command> utility to manage their own group
|
||||
@@ -189,7 +189,7 @@
|
||||
|
||||
<programlisting>
|
||||
$ groupadd -r groups
|
||||
$ chmod 2770 groupmems
|
||||
$ chmod 2710 groupmems
|
||||
$ chown root.groups groupmems
|
||||
$ groupmems -g groups -a gk4
|
||||
</programlisting>
|
||||
|
||||
@@ -186,6 +186,23 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-P</option>, <option>--prefix</option> <replaceable>PREFIX_DIR</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Apply changes in the <replaceable>PREFIX_DIR</replaceable>
|
||||
directory and use the configuration files from the
|
||||
<replaceable>PREFIX_DIR</replaceable> directory.
|
||||
This option does not chroot and is intended for preparing
|
||||
a cross-compilation target.
|
||||
Some limitations: NIS and LDAP users/groups are not verified.
|
||||
PAM authentication is using the host files.
|
||||
No SELINUX support.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
@@ -239,43 +256,61 @@
|
||||
<varlistentry>
|
||||
<term><replaceable>0</replaceable></term>
|
||||
<listitem>
|
||||
<para>success</para>
|
||||
<para>E_SUCCESS: success</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>2</replaceable></term>
|
||||
<listitem>
|
||||
<para>invalid command syntax</para>
|
||||
<para>E_USAGE: invalid command syntax</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>3</replaceable></term>
|
||||
<listitem>
|
||||
<para>invalid argument to option</para>
|
||||
<para>E_BAD_ARG: invalid argument to option</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>4</replaceable></term>
|
||||
<listitem>
|
||||
<para>specified group doesn't exist</para>
|
||||
<para>E_GID_IN_USE: specified group doesn't exist</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>6</replaceable></term>
|
||||
<listitem>
|
||||
<para>specified group doesn't exist</para>
|
||||
<para>E_NOTFOUND: specified group doesn't exist</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>9</replaceable></term>
|
||||
<listitem>
|
||||
<para>group name already in use</para>
|
||||
<para>E_NAME_IN_USE: group name already in use</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>10</replaceable></term>
|
||||
<listitem>
|
||||
<para>can't update group file</para>
|
||||
<para>E_GRP_UPDATE: can't update group file</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>11</replaceable></term>
|
||||
<listitem>
|
||||
<para>E_CLEANUP_SERVICE: can't setup cleanup service</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>12</replaceable></term>
|
||||
<listitem>
|
||||
<para>E_PAM_USERNAME: can't determine your username for use with pam</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><replaceable>13</replaceable></term>
|
||||
<listitem>
|
||||
<para>E_PAM_ERROR: pam returned an error, see syslog facility id groupmod for the PAM error message</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
-->
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY LASTLOG_UID_MAX SYSTEM "login.defs.d/LASTLOG_UID_MAX.xml">
|
||||
<!-- SHADOW-CONFIG-HERE -->
|
||||
]>
|
||||
<refentry id='lastlog.8'>
|
||||
@@ -200,6 +201,18 @@
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id='configuration'>
|
||||
<title>CONFIGURATION</title>
|
||||
<para>
|
||||
The following configuration variables in
|
||||
<filename>/etc/login.defs</filename> change the behavior of this
|
||||
tool:
|
||||
</para>
|
||||
<variablelist>
|
||||
&LASTLOG_UID_MAX;
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id='files'>
|
||||
<title>FILES</title>
|
||||
<variablelist>
|
||||
|
||||
@@ -50,10 +50,12 @@
|
||||
<!ENTITY FAKE_SHELL SYSTEM "login.defs.d/FAKE_SHELL.xml">
|
||||
<!ENTITY FTMP_FILE SYSTEM "login.defs.d/FTMP_FILE.xml">
|
||||
<!ENTITY GID_MAX SYSTEM "login.defs.d/GID_MAX.xml">
|
||||
<!ENTITY HOME_MODE SYSTEM "login.defs.d/HOME_MODE.xml">
|
||||
<!ENTITY HUSHLOGIN_FILE SYSTEM "login.defs.d/HUSHLOGIN_FILE.xml">
|
||||
<!ENTITY ISSUE_FILE SYSTEM "login.defs.d/ISSUE_FILE.xml">
|
||||
<!ENTITY KILLCHAR SYSTEM "login.defs.d/KILLCHAR.xml">
|
||||
<!ENTITY LASTLOG_ENAB SYSTEM "login.defs.d/LASTLOG_ENAB.xml">
|
||||
<!ENTITY LASTLOG_UID_MAX SYSTEM "login.defs.d/LASTLOG_UID_MAX.xml">
|
||||
<!ENTITY LOG_OK_LOGINS SYSTEM "login.defs.d/LOG_OK_LOGINS.xml">
|
||||
<!ENTITY LOG_UNKFAIL_ENAB SYSTEM "login.defs.d/LOG_UNKFAIL_ENAB.xml">
|
||||
<!ENTITY LOGIN_RETRIES SYSTEM "login.defs.d/LOGIN_RETRIES.xml">
|
||||
@@ -184,10 +186,12 @@
|
||||
&FAKE_SHELL;
|
||||
&FTMP_FILE;
|
||||
&GID_MAX; <!-- documents also GID_MIN -->
|
||||
&HOME_MODE;
|
||||
&HUSHLOGIN_FILE;
|
||||
&ISSUE_FILE;
|
||||
&KILLCHAR;
|
||||
&LASTLOG_ENAB;
|
||||
&LASTLOG_UID_MAX;
|
||||
&LOG_OK_LOGINS;
|
||||
&LOG_UNKFAIL_ENAB;
|
||||
&LOGIN_RETRIES;
|
||||
@@ -349,7 +353,12 @@
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<!-- id: no variables -->
|
||||
<!-- lastlog: no variables -->
|
||||
<varlistentry>
|
||||
<term>lastlog</term>
|
||||
<listitem>
|
||||
<para>LASTLOG_UID_MAX</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>login</term>
|
||||
<listitem>
|
||||
@@ -365,7 +374,7 @@
|
||||
HUSHLOGIN_FILE
|
||||
<phrase condition="no_pam">ISSUE_FILE</phrase>
|
||||
KILLCHAR
|
||||
<phrase condition="no_pam">LASTLOG_ENAB</phrase>
|
||||
<phrase condition="no_pam">LASTLOG_ENAB LASTLOG_UID_MAX</phrase>
|
||||
LOGIN_RETRIES
|
||||
<phrase condition="no_pam">LOGIN_STRING</phrase>
|
||||
LOGIN_TIMEOUT LOG_OK_LOGINS LOG_UNKFAIL_ENAB
|
||||
@@ -394,6 +403,7 @@
|
||||
ENCRYPT_METHOD
|
||||
GID_MAX GID_MIN
|
||||
MAX_MEMBERS_PER_GROUP MD5_CRYPT_ENAB
|
||||
HOME_MODE
|
||||
PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE
|
||||
<phrase condition="sha_crypt">SHA_CRYPT_MAX_ROUNDS
|
||||
SHA_CRYPT_MIN_ROUNDS</phrase>
|
||||
@@ -474,6 +484,8 @@
|
||||
<para>
|
||||
CREATE_HOME
|
||||
GID_MAX GID_MIN
|
||||
HOME_MODE
|
||||
LASTLOG_UID_MAX
|
||||
MAIL_DIR MAX_MEMBERS_PER_GROUP
|
||||
PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE
|
||||
SUB_GID_COUNT SUB_GID_MAX SUB_GID_MIN
|
||||
@@ -498,6 +510,7 @@
|
||||
<term>usermod</term>
|
||||
<listitem>
|
||||
<para>
|
||||
LASTLOG_UID_MAX
|
||||
MAIL_DIR MAIL_FILE MAX_MEMBERS_PER_GROUP
|
||||
<phrase condition="tcb">TCB_SYMLINKS USE_TCB</phrase>
|
||||
</para>
|
||||
|
||||
43
man/login.defs.d/HOME_MODE.xml
Normal file
43
man/login.defs.d/HOME_MODE.xml
Normal file
@@ -0,0 +1,43 @@
|
||||
<!--
|
||||
Copyright (c) 1991 - 1993, Julianne Frances Haugh
|
||||
Copyright (c) 1991 - 1993, Chip Rosenthal
|
||||
Copyright (c) 2007 - 2009, Nicolas François
|
||||
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. The name of the copyright holders or contributors may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT
|
||||
HOLDERS 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.
|
||||
-->
|
||||
<varlistentry>
|
||||
<term><option>HOME_MODE</option> (number)</term>
|
||||
<listitem>
|
||||
<para>
|
||||
The mode for new home directories. If not specified,
|
||||
the <option>UMASK</option> is used to create the mode.
|
||||
</para>
|
||||
<para>
|
||||
<command>useradd</command> and <command>newusers</command> use this
|
||||
to set the mode of the home directory they create.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
46
man/login.defs.d/LASTLOG_UID_MAX.xml
Normal file
46
man/login.defs.d/LASTLOG_UID_MAX.xml
Normal file
@@ -0,0 +1,46 @@
|
||||
<!--
|
||||
Copyright (c) 1991 - 1993, Julianne Frances Haugh
|
||||
Copyright (c) 1991 - 1993, Chip Rosenthal
|
||||
Copyright (c) 2007 - 2008, Nicolas François
|
||||
Copyright (c) 2018, 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. The name of the copyright holders or contributors may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT
|
||||
HOLDERS 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.
|
||||
-->
|
||||
<varlistentry>
|
||||
<term><option>LASTLOG_UID_MAX</option> (number)</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Highest user ID number for which the lastlog entries should be
|
||||
updated. As higher user IDs are usually tracked by remote user
|
||||
identity and authentication services there is no need to create
|
||||
a huge sparse lastlog file for them.
|
||||
</para>
|
||||
<para>
|
||||
No <option>LASTLOG_UID_MAX</option> option present in the configuration
|
||||
means that there is no user ID limit for writing lastlog entries.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -42,7 +42,7 @@
|
||||
<para>
|
||||
The default values for <option>SUB_GID_MIN</option>,
|
||||
<option>SUB_GID_MAX</option>, <option>SUB_GID_COUNT</option>
|
||||
are respectively 100000, 600100000 and 10000.
|
||||
are respectively 100000, 600100000 and 65536.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<para>
|
||||
The default values for <option>SUB_UID_MIN</option>,
|
||||
<option>SUB_UID_MAX</option>, <option>SUB_UID_COUNT</option>
|
||||
are respectively 100000, 600100000 and 10000.
|
||||
are respectively 100000, 600100000 and 65536.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
@@ -37,7 +37,8 @@
|
||||
</para>
|
||||
<para>
|
||||
<command>useradd</command> and <command>newusers</command> use this
|
||||
mask to set the mode of the home directory they create
|
||||
mask to set the mode of the home directory they create if
|
||||
<option>HOME_MODE</option> is not set.
|
||||
</para>
|
||||
<para condition="no_pam">
|
||||
It is also used by <command>login</command> to define users' initial
|
||||
|
||||
@@ -33,6 +33,13 @@
|
||||
]>
|
||||
|
||||
<refentry id='newgidmap.1'>
|
||||
<refentryinfo>
|
||||
<author>
|
||||
<firstname>Eric</firstname>
|
||||
<surname>Biederman</surname>
|
||||
<contrib>Creation, 2013</contrib>
|
||||
</author>
|
||||
</refentryinfo>
|
||||
<refmeta>
|
||||
<refentrytitle>newgidmap</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
|
||||
@@ -33,6 +33,13 @@
|
||||
]>
|
||||
|
||||
<refentry id='newuidmap.1'>
|
||||
<refentryinfo>
|
||||
<author>
|
||||
<firstname>Eric</firstname>
|
||||
<surname>Biederman</surname>
|
||||
<contrib>Creation, 2013</contrib>
|
||||
</author>
|
||||
</refentryinfo>
|
||||
<refmeta>
|
||||
<refentrytitle>newuidmap</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY ENCRYPT_METHOD SYSTEM "login.defs.d/ENCRYPT_METHOD.xml">
|
||||
<!ENTITY GID_MAX SYSTEM "login.defs.d/GID_MAX.xml">
|
||||
<!ENTITY HOME_MODE SYSTEM "login.defs.d/HOME_MODE.xml">
|
||||
<!ENTITY MAX_MEMBERS_PER_GROUP SYSTEM "login.defs.d/MAX_MEMBERS_PER_GROUP.xml">
|
||||
<!ENTITY MD5_CRYPT_ENAB SYSTEM "login.defs.d/MD5_CRYPT_ENAB.xml">
|
||||
<!ENTITY PASS_MAX_DAYS SYSTEM "login.defs.d/PASS_MAX_DAYS.xml">
|
||||
@@ -266,6 +267,18 @@
|
||||
<para>
|
||||
The options which apply to the <command>newusers</command> command are:
|
||||
</para>
|
||||
<variablelist remap='IP'>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--badname</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Allow names that do not conform to standards.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<variablelist remap='IP' condition="no_pam">
|
||||
<varlistentry>
|
||||
<term><option>-c</option>, <option>--crypt-method</option></term>
|
||||
@@ -370,6 +383,7 @@
|
||||
</variablelist>
|
||||
<variablelist>
|
||||
&GID_MAX; <!-- documents also GID_MIN -->
|
||||
&HOME_MODE;
|
||||
&MAX_MEMBERS_PER_GROUP;
|
||||
</variablelist>
|
||||
<variablelist condition="no_pam">
|
||||
|
||||
@@ -72,6 +72,9 @@
|
||||
<citerefentry><refentrytitle>nologin</refentrytitle><manvolnum>5</manvolnum>
|
||||
</citerefentry>.
|
||||
</para>
|
||||
<para>
|
||||
If <command>SSH_ORIGINAL_COMMAND</command> is populated it will be logged.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id='see_also'>
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<title>DESCRIPTION</title>
|
||||
<para>
|
||||
The <command>passwd</command> command changes passwords for user accounts.
|
||||
A normal user may only change the password for his/her own account, while
|
||||
A normal user may only change the password for their own account, while
|
||||
the superuser may change the password for any account.
|
||||
<command>passwd</command> also changes the account or associated
|
||||
password validity period.
|
||||
@@ -97,7 +97,7 @@
|
||||
<refsect2 id='password_changes'>
|
||||
<title>Password Changes</title>
|
||||
<para>
|
||||
The user is first prompted for his/her old password, if one is
|
||||
The user is first prompted for their old password, if one is
|
||||
present. This password is then encrypted and compared against the
|
||||
stored password. The user has only one chance to enter the correct
|
||||
password. The superuser is permitted to bypass this step so that
|
||||
@@ -206,7 +206,7 @@
|
||||
<listitem>
|
||||
<para>
|
||||
Immediately expire an account's password. This in effect can
|
||||
force a user to change his/her password at the user's next login.
|
||||
force a user to change their password at the user's next login.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -273,7 +273,7 @@
|
||||
<para>
|
||||
Set the minimum number of days between password changes to
|
||||
<replaceable>MIN_DAYS</replaceable>. A value of zero for this field
|
||||
indicates that the user may change his/her password at any time.
|
||||
indicates that the user may change their password at any time.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -349,7 +349,7 @@
|
||||
Set the number of days of warning before a password change is
|
||||
required. The <replaceable>WARN_DAYS</replaceable> option is
|
||||
the number of days prior to the password expiring that a user
|
||||
will be warned that his/her password is about to expire.
|
||||
will be warned that their password is about to expire.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@@ -363,6 +363,11 @@
|
||||
<replaceable>MAX_DAYS</replaceable>, the password is required
|
||||
to be changed.
|
||||
</para>
|
||||
<para>
|
||||
Passing the number <emphasis remap='I'>-1</emphasis> as
|
||||
<replaceable>MAX_DAYS</replaceable> will remove checking a
|
||||
password's validity.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
@@ -98,24 +98,43 @@
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
The encrypted password field may be blank, in which case no password
|
||||
is required to authenticate as the specified login name. However,
|
||||
some applications which read the <filename>/etc/passwd</filename> file
|
||||
may decide not to permit <emphasis>any</emphasis> access at all if the
|
||||
<emphasis>password</emphasis> field is blank. If the
|
||||
<emphasis>password</emphasis> field is a lower-case <quote>x</quote>,
|
||||
then the encrypted password is actually stored in the
|
||||
If the <emphasis>password</emphasis> field is a lower-case
|
||||
<quote>x</quote>, then the encrypted password is actually stored in the
|
||||
<citerefentry><refentrytitle>shadow</refentrytitle>
|
||||
<manvolnum>5</manvolnum></citerefentry> file instead; there
|
||||
<emphasis>must</emphasis> be a corresponding line in the
|
||||
<filename>/etc/shadow</filename> file, or else the user account is invalid.
|
||||
If the <emphasis>password</emphasis> field is any other string, then
|
||||
it will be treated as an encrypted password, as specified by
|
||||
<citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry>.
|
||||
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The encrypted <emphasis>password</emphasis> field may be empty,
|
||||
in which case no password is required to authenticate as the
|
||||
specified login name. However, some applications which read the
|
||||
<filename>/etc/passwd</filename> file may decide not to permit
|
||||
<emphasis>any</emphasis> access at all if the
|
||||
<emphasis>password</emphasis> field is blank.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
A <emphasis>password</emphasis> field which starts with an
|
||||
exclamation mark means that the password is locked. The
|
||||
remaining characters on the line represent the
|
||||
<emphasis>password</emphasis> field before the password was
|
||||
locked.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Refer to <citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry> for details on how
|
||||
this string is interpreted.
|
||||
</para>
|
||||
<para>
|
||||
If the password field contains some string that is not a valid
|
||||
result of <citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry>, for instance ! or *,
|
||||
the user will not be able to use a unix password to log in
|
||||
(but the user may log in the system by other means).
|
||||
</para>
|
||||
<para>
|
||||
The comment field is used by various system utilities, such as
|
||||
<citerefentry><refentrytitle>finger</refentrytitle>
|
||||
|
||||
42
man/po/da.po
42
man/po/da.po
@@ -1023,7 +1023,7 @@ msgstr ""
|
||||
#| "<option>-f</option>, <option>--inactive</option> "
|
||||
#| "<replaceable>INACTIVE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-f</option>, <option>--inactive</option> <replaceable>INAKTIV</"
|
||||
@@ -1052,7 +1052,7 @@ msgstr ""
|
||||
#| "<option>-e</option>, <option>--expiredate</option> "
|
||||
#| "<replaceable>EXPIRE_DATE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-e</option>, <option>--expiredate</option> "
|
||||
@@ -1065,8 +1065,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1076,7 +1076,7 @@ msgstr ""
|
||||
#| "<option>-f</option>, <option>--inactive</option> "
|
||||
#| "<replaceable>INACTIVE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-f</option>, <option>--inactive</option> <replaceable>INAKTIV</"
|
||||
@@ -1099,7 +1099,7 @@ msgstr ""
|
||||
#| "<option>-e</option>, <option>--expiredate</option> "
|
||||
#| "<replaceable>EXPIRE_DATE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-e</option>, <option>--expiredate</option> "
|
||||
@@ -1112,8 +1112,8 @@ msgstr ""
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -4307,7 +4307,7 @@ msgstr ""
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -4318,7 +4318,7 @@ msgstr ""
|
||||
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -4435,7 +4435,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr ""
|
||||
"Angiv øjeblikkelig en kontos adgangskode som udløbet. Dette kan tvinge en "
|
||||
"bruger til at ændre sin adgangskode ved brugerens næste logind."
|
||||
@@ -4504,7 +4504,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:291(term)
|
||||
@@ -4553,7 +4553,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
|
||||
@@ -6892,7 +6892,7 @@ msgstr "-l"
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -6980,7 +6980,7 @@ msgstr ""
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
@@ -6992,7 +6992,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -7975,7 +7975,7 @@ msgstr "ændr udløbsinformation om brugeradgangskode"
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:92(para)
|
||||
@@ -8057,8 +8057,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -8080,7 +8080,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
|
||||
@@ -8105,7 +8105,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
"Kommandoen <command>chage</command> er begrænset til administratorbrugeren "
|
||||
"(root), undtaget for tilvalget <option>-l</option>, som kan bruges af en "
|
||||
|
||||
52
man/po/de.po
52
man/po/de.po
@@ -1092,7 +1092,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1129,7 +1129,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1142,8 +1142,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1153,7 +1153,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1184,7 +1184,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1201,8 +1201,8 @@ msgstr ""
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -3087,7 +3087,7 @@ msgstr "5"
|
||||
#: limits.5.xml:61(refmiscinfo) gshadow.5.xml:48(refmiscinfo)
|
||||
#: faillog.5.xml:59(refmiscinfo)
|
||||
msgid "File Formats and Conversions"
|
||||
msgstr "Dateiformate und -konvertierung"
|
||||
msgstr "Dateiformate und konvertierung"
|
||||
|
||||
#: suauth.5.xml:65(refpurpose)
|
||||
msgid "detailed su control file"
|
||||
@@ -4370,7 +4370,7 @@ msgstr ""
|
||||
|
||||
#: shadow.5.xml:235(para)
|
||||
msgid "An empty field means that the account will never expire."
|
||||
msgstr "Ein leeren Feld bedeutet, dass das Konto nicht verfallen wird."
|
||||
msgstr "Ein leeres Feld bedeutet, dass das Konto nicht verfallen wird."
|
||||
|
||||
#: shadow.5.xml:238(para)
|
||||
msgid ""
|
||||
@@ -5459,7 +5459,7 @@ msgstr "ändert das Passwort eines Benutzers"
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -5475,7 +5475,7 @@ msgstr "Verändern des Passworts"
|
||||
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -5625,7 +5625,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr ""
|
||||
"Lässt das Passwort eines Kontos sofort verfallen. Im Ergebnis kann damit "
|
||||
"erreicht werden, dass ein Benutzer beim nächsten Login das Passwort ändern "
|
||||
@@ -5709,7 +5709,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
"Setzt die Anzahl von Tagen, die mindestens zwischen zwei Änderungen eines "
|
||||
"Passworts vergehen müssen, auf <replaceable>MIN_TAGE</replaceable>. Ein Wert "
|
||||
@@ -5776,7 +5776,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
"Legt die Anzahl der Tage fest, an denen der Benutzer eine Warnung erhält, "
|
||||
@@ -6961,7 +6961,7 @@ msgid ""
|
||||
"contents of this file should be a message indicating why logins are "
|
||||
"inhibited."
|
||||
msgstr ""
|
||||
"Falls angegeben, der Name einer Datei, dessen Existenz Anmeldungen außer von "
|
||||
"Falls angegeben, der Name einer Datei, deren Existenz Anmeldungen außer von "
|
||||
"Root verhindert. Der Inhalt der Datei sollte die Gründe enthalten, weshalb "
|
||||
"Anmeldungen untersagt sind."
|
||||
|
||||
@@ -8773,7 +8773,7 @@ msgstr "-l"
|
||||
# SB: 1. I don't understand "sake"? A typo? But of what? 2. I think we shouldn't have the notorious guest account here as an example.
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -8878,14 +8878,14 @@ msgstr "EINRICHTUNG"
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
"utility to manage their own group membership list."
|
||||
msgstr ""
|
||||
"Die ausführbare Datei <command>groupmems</command> sollte die Rechte "
|
||||
"<literal>2770</literal> haben und dem Benutzer <emphasis>root</emphasis> und "
|
||||
"<literal>2710</literal> haben und dem Benutzer <emphasis>root</emphasis> und "
|
||||
"der Gruppe <emphasis>groups</emphasis> gehören. Der Systemadministrator kann "
|
||||
"Benutzer der Gruppe <emphasis>groups</emphasis> hinzufügen, um ihnen zu "
|
||||
"ermöglichen, mit <command>groupmems</command> die Mitgliederliste ihrer "
|
||||
@@ -8896,14 +8896,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -10266,7 +10266,7 @@ msgstr "ändert die Information zum Passwortverfall"
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
"Der Befehl <command>chage</command> verändert die Anzahl der Tage zwischen "
|
||||
"dem letzten Wechsel des Passworts und dem nächsten Wechsel. Mit dieser "
|
||||
@@ -10386,8 +10386,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -10419,7 +10419,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
"Legt die Anzahl der Tage fest, an denen der Benutzer eine Warnung erhält, "
|
||||
@@ -10454,7 +10454,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
"Der Befehl <command>chage</command> kann nur von Root ausgeführt werden. "
|
||||
"Alle anderen Benutzer können nur die Option <option>-l</option> verwenden, "
|
||||
|
||||
1182
man/po/fr.po
1182
man/po/fr.po
File diff suppressed because it is too large
Load Diff
46
man/po/it.po
46
man/po/it.po
@@ -1151,7 +1151,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1189,7 +1189,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1202,8 +1202,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1214,7 +1214,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1247,7 +1247,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1262,8 +1262,8 @@ msgstr "Rimuove tutti gli utenti SELinux assegnati al login utente."
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -5714,7 +5714,7 @@ msgstr "cambia la password utente"
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -5731,7 +5731,7 @@ msgstr "Modifiche delle password"
|
||||
# type: Plain text
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -5892,7 +5892,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr ""
|
||||
"Fa scadere subito la password dell'utente. Il che ha l'effetto di forzare un "
|
||||
"cambio password al successivo accesso da parte dell'utente."
|
||||
@@ -5978,7 +5978,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
"Imposta il numero minimo di giorni tra i cambi di password a "
|
||||
"<replaceable>MIN_GIORNI</replaceable>. Un valore pari a zero indica che "
|
||||
@@ -6050,7 +6050,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
"Imposta il numero di giorni di preavviso prima che sia obbligatorio cambiare "
|
||||
@@ -9144,7 +9144,7 @@ msgstr "-l"
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -9254,14 +9254,14 @@ msgstr "CONFIGURAZIONE"
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
"utility to manage their own group membership list."
|
||||
msgstr ""
|
||||
"L'eseguibile <command>groupmems</command> dovrebbe avere i permessi "
|
||||
"<literal>2770</literal> ed essere di proprietà di <emphasis>root</emphasis> "
|
||||
"<literal>2710</literal> ed essere di proprietà di <emphasis>root</emphasis> "
|
||||
"e del gruppo <emphasis>groups</emphasis>. L'amministratore di sistema può "
|
||||
"aggiungere utenti al gruppo <emphasis>groups</emphasis> per permettere loro "
|
||||
"di poter gestire l'elenco di membri del proprio gruppo tramite il comando "
|
||||
@@ -9272,14 +9272,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" $ groupadd -r groups\n"
|
||||
" $ chmod 2770 groupmems\n"
|
||||
" $ chmod 2710 groupmems\n"
|
||||
" $ chown root.groups groupmems\n"
|
||||
" $ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -10707,7 +10707,7 @@ msgstr "cambia le informazioni sulla scadenza della password"
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
"<command>chage</command> modifica il numero minimo di giorni tra i cambi di "
|
||||
"password e la data dell'ultimo cambio. Queste informazioni sono usate dal "
|
||||
@@ -10832,8 +10832,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -10868,7 +10868,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
"Imposta il numero di giorni di preavviso prima che sia obbligatorio cambiare "
|
||||
@@ -10905,7 +10905,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
"L'uso del comando <command>chage</command> è permesso solo all'utente root, "
|
||||
"tranne per l'opzione <option>-l</option>, che può essere usata da un utente "
|
||||
|
||||
44
man/po/pl.po
44
man/po/pl.po
@@ -1088,7 +1088,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>KLUCZ</"
|
||||
@@ -1117,7 +1117,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>KLUCZ</"
|
||||
@@ -1130,8 +1130,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1141,7 +1141,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>KLUCZ</"
|
||||
@@ -1164,7 +1164,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>KLUCZ</"
|
||||
@@ -1177,8 +1177,8 @@ msgstr ""
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -4659,7 +4659,7 @@ msgstr "zmiana hasła użytkownika"
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -4670,7 +4670,7 @@ msgstr ""
|
||||
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -4776,7 +4776,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:220(term)
|
||||
@@ -4845,7 +4845,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
"Utawia minimalną liczbę dni pomiędzy zmianami hasła na "
|
||||
"<replaceable>MIN_DAYS</replaceable>. Wartość zerowa oznacza, że użytkownik "
|
||||
@@ -4901,7 +4901,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
|
||||
@@ -7455,7 +7455,7 @@ msgstr "-l"
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -7558,7 +7558,7 @@ msgstr ""
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
@@ -7570,14 +7570,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -8833,7 +8833,7 @@ msgstr "zmiana informacji o terminie ważności hasła użytkownika"
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
"Polecenie <command>chage</command> zmienia liczbę dni pomiędzy zmianami "
|
||||
"hasła i datę ostatniej zmiany hasła. Informację tę system wykorzystuje do "
|
||||
@@ -8947,8 +8947,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -8980,7 +8980,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
"Ustawia na <replaceable>DNI_OSTRZ</replaceable> liczbę dni przed upływem "
|
||||
@@ -9013,7 +9013,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
"Polecenia chage może użyć tylko użytkownik root, za wyjątkiem opcji <option>-"
|
||||
"l</option>. Może się nią posłużyć się użytkownik nieuprzywilejowany do "
|
||||
|
||||
46
man/po/ru.po
46
man/po/ru.po
@@ -1133,7 +1133,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>УЧЁТНАЯ "
|
||||
@@ -1170,7 +1170,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>УЧЁТНАЯ "
|
||||
@@ -1183,8 +1183,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1194,7 +1194,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>УЧЁТНАЯ "
|
||||
@@ -1225,7 +1225,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>УЧЁТНАЯ "
|
||||
@@ -1242,8 +1242,8 @@ msgstr ""
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -5700,7 +5700,7 @@ msgstr "изменяет пароль пользователя"
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -5718,7 +5718,7 @@ msgstr "Изменение пароля"
|
||||
# type: Content of: <refentry><refsect1><refsect2><para>
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -5876,7 +5876,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr ""
|
||||
"Немедленно сделать пароль устаревшим. В результате это заставит пользователя "
|
||||
"изменить пароль при следующем входе в систему."
|
||||
@@ -5962,7 +5962,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
"Задать <replaceable>минимальное количество дней</replaceable> между сменами "
|
||||
"пароля. Нулевое значение этого поля указывает на то, что пользователь может "
|
||||
@@ -6030,7 +6030,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
"Установить число дней выдачи предупреждения, перед тем как потребуется смена "
|
||||
@@ -9182,7 +9182,7 @@ msgstr "-l"
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -9292,14 +9292,14 @@ msgstr "НАСТРОЙКА"
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
"utility to manage their own group membership list."
|
||||
msgstr ""
|
||||
"Исполняемый файл программы <command>groupmems</command> должен иметь права "
|
||||
"<literal>2770</literal>, принадлежать пользователю <emphasis>root</emphasis> "
|
||||
"<literal>2710</literal>, принадлежать пользователю <emphasis>root</emphasis> "
|
||||
"и группе <emphasis>groups</emphasis>. Системный администратор может "
|
||||
"добавлять пользователей в группу <emphasis>groups</emphasis>, разрешая или "
|
||||
"запрещая им запускать программу <command>groupmems</command> для управления "
|
||||
@@ -9311,14 +9311,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -10700,7 +10700,7 @@ msgstr "изменяет информацию об устаревании пар
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
"Программа <command>chage</command> изменяет количество дней между датой "
|
||||
"смены пароля и датой последней смены пароля. Эта информация используется "
|
||||
@@ -10820,8 +10820,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -10854,7 +10854,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
"Установить количество дней выдачи предупреждения, перед тем как потребуется "
|
||||
@@ -10890,7 +10890,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
"Программа <command>chage</command> работает только от суперпользователя, за "
|
||||
"исключением вызова с параметром <option>-l</option>, который может "
|
||||
|
||||
@@ -458,7 +458,7 @@ msgid "Note: if you wish to unlock the account (not only access with a password)
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:384(term)
|
||||
msgid "<option>-v</option>, <option>--add-sub-uids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgid "<option>-v</option>, <option>--add-subuids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:388(para)
|
||||
@@ -474,7 +474,7 @@ msgid "No checks will be performed with regard to <option>SUB_UID_MIN</option>,
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:402(term)
|
||||
msgid "<option>-V</option>, <option>--del-sub-uids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgid "<option>-V</option>, <option>--del-subuids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:406(para)
|
||||
@@ -482,11 +482,11 @@ msgid "Remove a range of subordinate uids from the user's account."
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid "This option may be specified multiple times to remove multiple ranges to a users account. When both <option>--del-sub-uids</option> and <option>--add-sub-uids</option> are specified, the removal of all subordinate uid ranges happens before any subordinate uid range is added."
|
||||
msgid "This option may be specified multiple times to remove multiple ranges to a users account. When both <option>--del-subuids</option> and <option>--add-subuids</option> are specified, the removal of all subordinate uid ranges happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:422(term)
|
||||
msgid "<option>-w</option>, <option>--add-sub-gids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgid "<option>-w</option>, <option>--add-subgids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:426(para)
|
||||
@@ -498,7 +498,7 @@ msgid "No checks will be performed with regard to <option>SUB_GID_MIN</option>,
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:440(term)
|
||||
msgid "<option>-W</option>, <option>--del-sub-gids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgid "<option>-W</option>, <option>--del-subgids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:444(para)
|
||||
@@ -506,7 +506,7 @@ msgid "Remove a range of subordinate gids from the user's account."
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid "This option may be specified multiple times to remove multiple ranges to a users account. When both <option>--del-sub-gids</option> and <option>--add-sub-gids</option> are specified, the removal of all subordinate gid ranges happens before any subordinate gid range is added."
|
||||
msgid "This option may be specified multiple times to remove multiple ranges to a users account. When both <option>--del-subgids</option> and <option>--add-subgids</option> are specified, the removal of all subordinate gid ranges happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
#: usermod.8.xml:460(term) useradd.8.xml:506(term)
|
||||
@@ -2492,7 +2492,7 @@ msgid "change user password"
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid "The <command>passwd</command> command changes passwords for user accounts. A normal user may only change the password for his/her own account, while the superuser may change the password for any account. <command>passwd</command> also changes the account or associated password validity period."
|
||||
msgid "The <command>passwd</command> command changes passwords for user accounts. A normal user may only change the password for their own account, while the superuser may change the password for any account. <command>passwd</command> also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:98(title)
|
||||
@@ -2500,7 +2500,7 @@ msgid "Password Changes"
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid "The user is first prompted for his/her old password, if one is present. This password is then encrypted and compared against the stored password. The user has only one chance to enter the correct password. The superuser is permitted to bypass this step so that forgotten passwords may be changed."
|
||||
msgid "The user is first prompted for their old password, if one is present. This password is then encrypted and compared against the stored password. The user has only one chance to enter the correct password. The superuser is permitted to bypass this step so that forgotten passwords may be changed."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:107(para)
|
||||
@@ -2572,7 +2572,7 @@ msgid "<option>-e</option>, <option>--expire</option>"
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid "Immediately expire an account's password. This in effect can force a user to change his/her password at the user's next login."
|
||||
msgid "Immediately expire an account's password. This in effect can force a user to change their password at the user's next login."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:220(term)
|
||||
@@ -2612,7 +2612,7 @@ msgid "<option>-n</option>, <option>--mindays</option> <replaceable>MIN_DAY
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:273(para) chage.1.xml:168(para)
|
||||
msgid "Set the minimum number of days between password changes to <replaceable>MIN_DAYS</replaceable>. A value of zero for this field indicates that the user may change his/her password at any time."
|
||||
msgid "Set the minimum number of days between password changes to <replaceable>MIN_DAYS</replaceable>. A value of zero for this field indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:291(term)
|
||||
@@ -2644,7 +2644,7 @@ msgid "<option>-w</option>, <option>--warndays</option> <replaceable>WARN_D
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:348(para)
|
||||
msgid "Set the number of days of warning before a password change is required. The <replaceable>WARN_DAYS</replaceable> option is the number of days prior to the password expiring that a user will be warned that his/her password is about to expire."
|
||||
msgid "Set the number of days of warning before a password change is required. The <replaceable>WARN_DAYS</replaceable> option is the number of days prior to the password expiring that a user will be warned that their password is about to expire."
|
||||
msgstr ""
|
||||
|
||||
#: passwd.1.xml:357(term)
|
||||
@@ -4169,7 +4169,7 @@ msgid "-l"
|
||||
msgstr ""
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid "The <command>groupmems</command> command allows a user to administer his/her own group membership list without the requirement of superuser privileges. The <command>groupmems</command> utility is for systems that configure its users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
msgid "The <command>groupmems</command> command allows a user to administer their own group membership list without the requirement of superuser privileges. The <command>groupmems</command> utility is for systems that configure its users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
msgstr ""
|
||||
|
||||
#: groupmems.8.xml:94(para)
|
||||
@@ -4233,12 +4233,12 @@ msgid "SETUP"
|
||||
msgstr ""
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid "The <command>groupmems</command> executable should be in mode <literal>2770</literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</emphasis>. The system administrator can add users to group <emphasis>groups</emphasis> to allow or disallow them using the <command>groupmems</command> utility to manage their own group membership list."
|
||||
msgid "The <command>groupmems</command> executable should be in mode <literal>2710</literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</emphasis>. The system administrator can add users to group <emphasis>groups</emphasis> to allow or disallow them using the <command>groupmems</command> utility to manage their own group membership list."
|
||||
msgstr ""
|
||||
|
||||
#: groupmems.8.xml:190(programlisting)
|
||||
#, no-wrap
|
||||
msgid "\n\t$ groupadd -r groups\n\t$ chmod 2770 groupmems\n\t$ chown root.groups groupmems\n\t$ groupmems -g groups -a gk4\n "
|
||||
msgid "\n\t$ groupadd -r groups\n\t$ chmod 2710 groupmems\n\t$ chown root.groups groupmems\n\t$ groupmems -g groups -a gk4\n "
|
||||
msgstr ""
|
||||
|
||||
#: groupmems.8.xml:222(para)
|
||||
@@ -4863,7 +4863,7 @@ msgid "change user password expiry information"
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:82(para)
|
||||
msgid "The <command>chage</command> command changes the number of days between password changes and the date of the last password change. This information is used by the system to determine when a user must change his/her password."
|
||||
msgid "The <command>chage</command> command changes the number of days between password changes and the date of the last password change. This information is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:92(para)
|
||||
@@ -4915,7 +4915,7 @@ msgid "<option>-M</option>, <option>--maxdays</option> <replaceable>MAX_DAY
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:180(para)
|
||||
msgid "Set the maximum number of days during which a password is valid. When <replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> is less than the current day, the user will be required to change his/her password before being able to use his/her account. This occurrence can be planned for in advance by use of the <option>-W</option> option, which provides the user with advance warning."
|
||||
msgid "Set the maximum number of days during which a password is valid. When <replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> is less than the current day, the user will be required to change their password before being able to use their account. This occurrence can be planned for in advance by use of the <option>-W</option> option, which provides the user with advance warning."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:189(para)
|
||||
@@ -4927,7 +4927,7 @@ msgid "<option>-W</option>, <option>--warndays</option> <replaceable>WARN_D
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:213(para)
|
||||
msgid "Set the number of days of warning before a password change is required. The <replaceable>WARN_DAYS</replaceable> option is the number of days prior to the password expiring that a user will be warned his/her password is about to expire."
|
||||
msgid "Set the number of days of warning before a password change is required. The <replaceable>WARN_DAYS</replaceable> option is the number of days prior to the password expiring that a user will be warned their password is about to expire."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:222(para)
|
||||
@@ -4939,7 +4939,7 @@ msgid "The <command>chage</command> program requires a shadow password file to b
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:236(para)
|
||||
msgid "The <command>chage</command> command is restricted to the root user, except for the <option>-l</option> option, which may be used by an unprivileged user to determine when his/her password or account is due to expire."
|
||||
msgid "The <command>chage</command> command is restricted to the root user, except for the <option>-l</option> option, which may be used by an unprivileged user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:301(replaceable)
|
||||
|
||||
44
man/po/sv.po
44
man/po/sv.po
@@ -1062,7 +1062,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>NYCKEL</"
|
||||
@@ -1091,7 +1091,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>NYCKEL</"
|
||||
@@ -1104,8 +1104,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1115,7 +1115,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>NYCKEL</"
|
||||
@@ -1138,7 +1138,7 @@ msgstr ""
|
||||
#| "<option>-K</option>, <option>--key</option> <replaceable>KEY</"
|
||||
#| "replaceable>=<replaceable>VALUE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-K</option>, <option>--key</option> <replaceable>NYCKEL</"
|
||||
@@ -1151,8 +1151,8 @@ msgstr ""
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -4806,7 +4806,7 @@ msgstr "ändra användarlösenord"
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -4824,7 +4824,7 @@ msgstr "Lösenordsändringar"
|
||||
#: passwd.1.xml:99(para)
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -4969,7 +4969,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr ""
|
||||
"Lösenordet för ett konto sätts omedelbart som utgånget. Detta kan tvinga en "
|
||||
"användare att ändra sitt lösenord vid nästa inloggningsförsök."
|
||||
@@ -5051,7 +5051,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
"Sätter minimalt antal dagar mellan lösenordsändringar till "
|
||||
"<replaceable>MIN_DAGAR</replaceable>. Ett nollvärde för detta fält betyder "
|
||||
@@ -5128,7 +5128,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
"Sätter antalet dagar för varning före ett lösenord behöver ändras. Flaggan "
|
||||
@@ -7671,7 +7671,7 @@ msgstr "-l"
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -7780,7 +7780,7 @@ msgstr ""
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
@@ -7792,14 +7792,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -9064,7 +9064,7 @@ msgstr "ändra åldringsinformation för användarlösenord"
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:92(para)
|
||||
@@ -9156,8 +9156,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -9181,7 +9181,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
|
||||
@@ -9206,7 +9206,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:301(replaceable)
|
||||
|
||||
@@ -1043,7 +1043,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-v</option>, <option>--add-sub-uids</option> "
|
||||
"<option>-v</option>, <option>--add-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1080,7 +1080,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-V</option>, <option>--del-sub-uids</option> "
|
||||
"<option>-V</option>, <option>--del-subuids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1093,8 +1093,8 @@ msgstr ""
|
||||
#: usermod.8.xml:409(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-uids</option> and <option>--add-"
|
||||
"sub-uids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"users account. When both <option>--del-subuids</option> and <option>--add-"
|
||||
"subuids</option> are specified, the removal of all subordinate uid ranges "
|
||||
"happens before any subordinate uid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -1104,7 +1104,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-w</option>, <option>--add-sub-gids</option> "
|
||||
"<option>-w</option>, <option>--add-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1136,7 +1136,7 @@ msgstr ""
|
||||
#| "<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
#| "replaceable>|<replaceable>RANGE</replaceable>"
|
||||
msgid ""
|
||||
"<option>-W</option>, <option>--del-sub-gids</option> "
|
||||
"<option>-W</option>, <option>--del-subgids</option> "
|
||||
"<replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>"
|
||||
msgstr ""
|
||||
"<option>-u</option>, <option>--user</option> <replaceable>LOGIN</"
|
||||
@@ -1151,8 +1151,8 @@ msgstr "移除用户登录的所有 SELinux 用户映射。"
|
||||
#: usermod.8.xml:447(para)
|
||||
msgid ""
|
||||
"This option may be specified multiple times to remove multiple ranges to a "
|
||||
"users account. When both <option>--del-sub-gids</option> and <option>--add-"
|
||||
"sub-gids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"users account. When both <option>--del-subgids</option> and <option>--add-"
|
||||
"subgids</option> are specified, the removal of all subordinate gid ranges "
|
||||
"happens before any subordinate gid range is added."
|
||||
msgstr ""
|
||||
|
||||
@@ -5037,7 +5037,7 @@ msgstr "更改用户密码"
|
||||
#: passwd.1.xml:89(para)
|
||||
msgid ""
|
||||
"The <command>passwd</command> command changes passwords for user accounts. A "
|
||||
"normal user may only change the password for his/her own account, while the "
|
||||
"normal user may only change the password for their own account, while the "
|
||||
"superuser may change the password for any account. <command>passwd</command> "
|
||||
"also changes the account or associated password validity period."
|
||||
msgstr ""
|
||||
@@ -5051,7 +5051,7 @@ msgstr "密码更改"
|
||||
|
||||
#: passwd.1.xml:99(para)
|
||||
msgid ""
|
||||
"The user is first prompted for his/her old password, if one is present. This "
|
||||
"The user is first prompted for their old password, if one is present. This "
|
||||
"password is then encrypted and compared against the stored password. The "
|
||||
"user has only one chance to enter the correct password. The superuser is "
|
||||
"permitted to bypass this step so that forgotten passwords may be changed."
|
||||
@@ -5181,7 +5181,7 @@ msgstr "<option>-e</option>, <option>--expire</option>"
|
||||
#: passwd.1.xml:207(para)
|
||||
msgid ""
|
||||
"Immediately expire an account's password. This in effect can force a user to "
|
||||
"change his/her password at the user's next login."
|
||||
"change their password at the user's next login."
|
||||
msgstr "让一个账户的密码立即过期。这可以强制一个用户下次登录时更改密码。"
|
||||
|
||||
#: passwd.1.xml:220(term)
|
||||
@@ -5255,7 +5255,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the minimum number of days between password changes to "
|
||||
"<replaceable>MIN_DAYS</replaceable>. A value of zero for this field "
|
||||
"indicates that the user may change his/her password at any time."
|
||||
"indicates that the user may change their password at any time."
|
||||
msgstr ""
|
||||
"在密码更改之间的最小天数设置为 <replaceable>MIN_DAYS</replaceable>。此字段中"
|
||||
"的 0 值表示用户可以在任何时间更改其密码。"
|
||||
@@ -5316,7 +5316,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned that his/her password is "
|
||||
"the password expiring that a user will be warned that their password is "
|
||||
"about to expire."
|
||||
msgstr ""
|
||||
"设置在要求更改密码之前警告的天数。<replaceable>WARN_DAYS</replaceable> 选项是"
|
||||
@@ -7867,7 +7867,7 @@ msgstr "-l"
|
||||
|
||||
#: groupmems.8.xml:86(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> command allows a user to administer his/her "
|
||||
"The <command>groupmems</command> command allows a user to administer their "
|
||||
"own group membership list without the requirement of superuser privileges. "
|
||||
"The <command>groupmems</command> utility is for systems that configure its "
|
||||
"users to be in their own name sake primary group (i.e., guest / guest)."
|
||||
@@ -7960,7 +7960,7 @@ msgstr ""
|
||||
|
||||
#: groupmems.8.xml:181(para)
|
||||
msgid ""
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2770</"
|
||||
"The <command>groupmems</command> executable should be in mode <literal>2710</"
|
||||
"literal> as user <emphasis>root</emphasis> and in group <emphasis>groups</"
|
||||
"emphasis>. The system administrator can add users to group <emphasis>groups</"
|
||||
"emphasis> to allow or disallow them using the <command>groupmems</command> "
|
||||
@@ -7972,14 +7972,14 @@ msgstr ""
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"\t$ groupadd -r groups\n"
|
||||
"\t$ chmod 2770 groupmems\n"
|
||||
"\t$ chmod 2710 groupmems\n"
|
||||
"\t$ chown root.groups groupmems\n"
|
||||
"\t$ groupmems -g groups -a gk4\n"
|
||||
" "
|
||||
@@ -9112,7 +9112,7 @@ msgstr "更改用户密码过期信息"
|
||||
msgid ""
|
||||
"The <command>chage</command> command changes the number of days between "
|
||||
"password changes and the date of the last password change. This information "
|
||||
"is used by the system to determine when a user must change his/her password."
|
||||
"is used by the system to determine when a user must change their password."
|
||||
msgstr ""
|
||||
|
||||
#: chage.1.xml:92(para)
|
||||
@@ -9209,8 +9209,8 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the maximum number of days during which a password is valid. When "
|
||||
"<replaceable>MAX_DAYS</replaceable> plus <replaceable>LAST_DAY</replaceable> "
|
||||
"is less than the current day, the user will be required to change his/her "
|
||||
"password before being able to use his/her account. This occurrence can be "
|
||||
"is less than the current day, the user will be required to change their "
|
||||
"password before being able to use their account. This occurrence can be "
|
||||
"planned for in advance by use of the <option>-W</option> option, which "
|
||||
"provides the user with advance warning."
|
||||
msgstr ""
|
||||
@@ -9240,7 +9240,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Set the number of days of warning before a password change is required. The "
|
||||
"<replaceable>WARN_DAYS</replaceable> option is the number of days prior to "
|
||||
"the password expiring that a user will be warned his/her password is about "
|
||||
"the password expiring that a user will be warned their password is about "
|
||||
"to expire."
|
||||
msgstr ""
|
||||
"设置在要求更改密码之前几天开始警告。<replaceable>WARN_DAYS</replaceable> 选项"
|
||||
@@ -9267,7 +9267,7 @@ msgstr "<command>chage</command> 需要有一个影子密码文件才可用。"
|
||||
msgid ""
|
||||
"The <command>chage</command> command is restricted to the root user, except "
|
||||
"for the <option>-l</option> option, which may be used by an unprivileged "
|
||||
"user to determine when his/her password or account is due to expire."
|
||||
"user to determine when their password or account is due to expire."
|
||||
msgstr ""
|
||||
"只有 root 才可以使用 <command>chage</command>,一个特殊情况是 <option>-l</"
|
||||
"option> 选项,用来让非特权用户觉得自己的密码或账户何时过期。"
|
||||
|
||||
@@ -182,6 +182,16 @@
|
||||
The options which apply to the <command>pwck</command> command are:
|
||||
</para>
|
||||
<variablelist remap='IP'>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--badname</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Allow names that do not conform to standards.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>-h</option>, <option>--help</option></term>
|
||||
<listitem>
|
||||
|
||||
@@ -95,18 +95,6 @@
|
||||
<varlistentry>
|
||||
<term><emphasis role="bold">encrypted password</emphasis></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Refer to <citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry> for details on how
|
||||
this string is interpreted.
|
||||
</para>
|
||||
<para>
|
||||
If the password field contains some string that is not a valid
|
||||
result of <citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry>, for instance ! or *,
|
||||
the user will not be able to use a unix password to log in
|
||||
(but the user may log in the system by other means).
|
||||
</para>
|
||||
<para>
|
||||
This field may be empty, in which case no passwords are
|
||||
required to authenticate as the specified login name.
|
||||
@@ -120,6 +108,18 @@
|
||||
line represent the password field before the password was
|
||||
locked.
|
||||
</para>
|
||||
<para>
|
||||
Refer to <citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry> for details on how
|
||||
this string is interpreted.
|
||||
</para>
|
||||
<para>
|
||||
If the password field contains some string that is not a valid
|
||||
result of <citerefentry><refentrytitle>crypt</refentrytitle>
|
||||
<manvolnum>3</manvolnum></citerefentry>, for instance ! or *,
|
||||
the user will not be able to use a unix password to log in
|
||||
(but the user may log in the system by other means).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
||||
41
man/su.1.xml
41
man/su.1.xml
@@ -85,12 +85,16 @@
|
||||
<cmdsynopsis>
|
||||
<command>su</command>
|
||||
<arg choice='opt'>
|
||||
<replaceable>options</replaceable>
|
||||
<replaceable>options</replaceable>
|
||||
</arg>
|
||||
<arg choice='opt'>
|
||||
<arg choice='plain'>
|
||||
<replaceable>username</replaceable>
|
||||
</arg>
|
||||
<replaceable>-</replaceable>
|
||||
</arg>
|
||||
<arg choice='opt'>
|
||||
<replaceable>username</replaceable>
|
||||
<arg choice='opt'>
|
||||
<replaceable>args</replaceable>
|
||||
</arg>
|
||||
</arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
@@ -98,26 +102,21 @@
|
||||
<refsect1 id='description'>
|
||||
<title>DESCRIPTION</title>
|
||||
<para>
|
||||
The <command>su</command> command is used to become another user during
|
||||
a login session. Invoked without a <option>username</option>,
|
||||
<command>su</command> defaults to
|
||||
becoming the superuser. The optional argument <option>-</option> may
|
||||
be used to provide an environment similar to what the user would
|
||||
expect had the user logged in directly.
|
||||
The <command>su</command> command is used to become another user during a
|
||||
login session. Invoked without a <option>username</option>,
|
||||
<command>su</command> defaults to becoming the superuser. The
|
||||
<option>-</option> option may be used to provide an environment similar
|
||||
to what the user would expect had the user logged in directly. The
|
||||
<option>-c</option> option may be used to treat the next argument as a
|
||||
command by most shells.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Additional arguments may be provided after the username, in which case
|
||||
they are supplied to the user's login shell. In particular, an
|
||||
argument of <option>-c</option> will cause the next argument to be
|
||||
treated as a command by most command interpreters. The command will be
|
||||
executed by the shell specified in <filename>/etc/passwd</filename>
|
||||
for the target user.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
You can use the <option>--</option> argument to separate
|
||||
<command>su</command> options from the arguments supplied to the shell.
|
||||
Options are recognized everywhere in the argument list. You can use the
|
||||
<option>--</option> argument to stop option parsing. The
|
||||
<option>-</option> option is special: it is also recognized after
|
||||
<option>--</option>, but has to be placed before
|
||||
<option>username</option>.
|
||||
</para>
|
||||
|
||||
<para>The user will be prompted for a password, if appropriate. Invalid
|
||||
|
||||
@@ -32,6 +32,13 @@
|
||||
<!-- SHADOW-CONFIG-HERE -->
|
||||
]>
|
||||
<refentry id='subgid.5'>
|
||||
<refentryinfo>
|
||||
<author>
|
||||
<firstname>Eric</firstname>
|
||||
<surname>Biederman</surname>
|
||||
<contrib>Creation, 2013</contrib>
|
||||
</author>
|
||||
</refentryinfo>
|
||||
<refmeta>
|
||||
<refentrytitle>subgid</refentrytitle>
|
||||
<manvolnum>5</manvolnum>
|
||||
|
||||
@@ -32,6 +32,13 @@
|
||||
<!-- SHADOW-CONFIG-HERE -->
|
||||
]>
|
||||
<refentry id='subuid.5'>
|
||||
<refentryinfo>
|
||||
<author>
|
||||
<firstname>Eric</firstname>
|
||||
<surname>Biederman</surname>
|
||||
<contrib>Creation, 2013</contrib>
|
||||
</author>
|
||||
</refentryinfo>
|
||||
<refmeta>
|
||||
<refentrytitle>subuid</refentrytitle>
|
||||
<manvolnum>5</manvolnum>
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY CREATE_HOME SYSTEM "login.defs.d/CREATE_HOME.xml">
|
||||
<!ENTITY GID_MAX SYSTEM "login.defs.d/GID_MAX.xml">
|
||||
<!ENTITY HOME_MODE SYSTEM "login.defs.d/HOME_MODE.xml">
|
||||
<!ENTITY LASTLOG_UID_MAX SYSTEM "login.defs.d/LASTLOG_UID_MAX.xml">
|
||||
<!ENTITY MAIL_DIR SYSTEM "login.defs.d/MAIL_DIR.xml">
|
||||
<!ENTITY MAX_MEMBERS_PER_GROUP SYSTEM "login.defs.d/MAX_MEMBERS_PER_GROUP.xml">
|
||||
<!ENTITY PASS_MAX_DAYS SYSTEM "login.defs.d/PASS_MAX_DAYS.xml">
|
||||
@@ -125,6 +127,16 @@
|
||||
<para>The options which apply to the <command>useradd</command> command are:
|
||||
</para>
|
||||
<variablelist remap='IP'>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--badname</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Allow names that do not conform to standards.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-b</option>, <option>--base-dir</option> <replaceable>BASE_DIR</replaceable>
|
||||
@@ -453,6 +465,23 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-P</option>, <option>--prefix</option> <replaceable>PREFIX_DIR</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Apply changes in the <replaceable>PREFIX_DIR</replaceable>
|
||||
directory and use the configuration files from the
|
||||
<replaceable>PREFIX_DIR</replaceable> directory.
|
||||
This option does not chroot and is intended for preparing
|
||||
a cross-compilation target.
|
||||
Some limitations: NIS and LDAP users/groups are not verified.
|
||||
PAM authentication is using the host files.
|
||||
No SELINUX support.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-s</option>, <option>--shell</option> <replaceable>SHELL</replaceable>
|
||||
@@ -653,6 +682,8 @@
|
||||
<variablelist>
|
||||
&CREATE_HOME;
|
||||
&GID_MAX; <!-- documents also GID_MIN -->
|
||||
&HOME_MODE;
|
||||
&LASTLOG_UID_MAX;
|
||||
&MAIL_DIR;
|
||||
&MAX_MEMBERS_PER_GROUP;
|
||||
&PASS_MAX_DAYS;
|
||||
|
||||
@@ -154,6 +154,23 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-P</option>, <option>--prefix</option> <replaceable>PREFIX_DIR</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Apply changes in the <replaceable>PREFIX_DIR</replaceable>
|
||||
directory and use the configuration files from the
|
||||
<replaceable>PREFIX_DIR</replaceable> directory.
|
||||
This option does not chroot and is intended for preparing
|
||||
a cross-compilation target.
|
||||
Some limitations: NIS and LDAP users/groups are not verified.
|
||||
PAM authentication is using the host files.
|
||||
No SELINUX support.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-Z</option>, <option>--selinux-user</option>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
-->
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.5//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY LASTLOG_UID_MAX SYSTEM "login.defs.d/LASTLOG_UID_MAX.xml">
|
||||
<!ENTITY MAIL_DIR SYSTEM "login.defs.d/MAIL_DIR.xml">
|
||||
<!ENTITY MAX_MEMBERS_PER_GROUP SYSTEM "login.defs.d/MAX_MEMBERS_PER_GROUP.xml">
|
||||
<!ENTITY SUB_GID_COUNT SYSTEM "login.defs.d/SUB_GID_COUNT.xml">
|
||||
@@ -107,6 +108,16 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-b</option>, <option>--badnames</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Allow names that do not conform to standards.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-c</option>, <option>--comment</option> <replaceable>COMMENT</replaceable>
|
||||
@@ -319,6 +330,23 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-P</option>, <option>--prefix</option> <replaceable>PREFIX_DIR</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Apply changes in the <replaceable>PREFIX_DIR</replaceable>
|
||||
directory and use the configuration files from the
|
||||
<replaceable>PREFIX_DIR</replaceable> directory.
|
||||
This option does not chroot and is intended for preparing
|
||||
a cross-compilation target.
|
||||
Some limitations: NIS and LDAP users/groups are not verified.
|
||||
PAM authentication is using the host files.
|
||||
No SELINUX support.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-s</option>, <option>--shell</option> <replaceable>SHELL</replaceable>
|
||||
@@ -382,7 +410,7 @@
|
||||
</varlistentry>
|
||||
<varlistentry condition="subids">
|
||||
<term>
|
||||
<option>-v</option>, <option>--add-sub-uids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
<option>-v</option>, <option>--add-subuids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -400,7 +428,7 @@
|
||||
</varlistentry>
|
||||
<varlistentry condition="subids">
|
||||
<term>
|
||||
<option>-V</option>, <option>--del-sub-uids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
<option>-V</option>, <option>--del-subuids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -408,7 +436,7 @@
|
||||
</para>
|
||||
<para>
|
||||
This option may be specified multiple times to remove multiple ranges to a users account.
|
||||
When both <option>--del-sub-uids</option> and <option>--add-sub-uids</option> are specified,
|
||||
When both <option>--del-subuids</option> and <option>--add-subuids</option> are specified,
|
||||
the removal of all subordinate uid ranges happens before any subordinate uid range is added.
|
||||
</para>
|
||||
<para>
|
||||
@@ -420,7 +448,7 @@
|
||||
</varlistentry>
|
||||
<varlistentry condition="subids">
|
||||
<term>
|
||||
<option>-w</option>, <option>--add-sub-gids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
<option>-w</option>, <option>--add-subgids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -438,7 +466,7 @@
|
||||
</varlistentry>
|
||||
<varlistentry condition="subids">
|
||||
<term>
|
||||
<option>-W</option>, <option>--del-sub-gids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
<option>-W</option>, <option>--del-subgids</option> <replaceable>FIRST</replaceable>-<replaceable>LAST</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
@@ -446,7 +474,7 @@
|
||||
</para>
|
||||
<para>
|
||||
This option may be specified multiple times to remove multiple ranges to a users account.
|
||||
When both <option>--del-sub-gids</option> and <option>--add-sub-gids</option> are specified,
|
||||
When both <option>--del-subgids</option> and <option>--add-subgids</option> are specified,
|
||||
the removal of all subordinate gid ranges happens before any subordinate gid range is added.
|
||||
</para>
|
||||
<para>
|
||||
@@ -500,6 +528,7 @@
|
||||
tool:
|
||||
</para>
|
||||
<variablelist>
|
||||
&LASTLOG_UID_MAX;
|
||||
&MAIL_DIR; <!-- documents also MAIL_FILE -->
|
||||
&MAX_MEMBERS_PER_GROUP;
|
||||
&SUB_GID_COUNT; <!-- documents also SUB_GID_MAX and SUB_GID_MIN -->
|
||||
|
||||
@@ -45,10 +45,13 @@ libmisc/entry.c
|
||||
libmisc/env.c
|
||||
libmisc/failure.c
|
||||
libmisc/find_new_gid.c
|
||||
libmisc/find_new_sub_gids.c
|
||||
libmisc/find_new_sub_uids.c
|
||||
libmisc/find_new_uid.c
|
||||
libmisc/getgr_nam_gid.c
|
||||
libmisc/getrange.c
|
||||
libmisc/hushed.c
|
||||
libmisc/idmapping.c
|
||||
libmisc/isexpired.c
|
||||
libmisc/limits.c
|
||||
libmisc/list.c
|
||||
@@ -59,6 +62,7 @@ libmisc/motd.c
|
||||
libmisc/myname.c
|
||||
libmisc/obscure.c
|
||||
libmisc/pam_pass.c
|
||||
libmisc/pam_pass_non_interactive.c
|
||||
libmisc/pwd2spwd.c
|
||||
libmisc/pwdcheck.c
|
||||
libmisc/pwd_init.c
|
||||
@@ -75,6 +79,7 @@ libmisc/sulog.c
|
||||
libmisc/ttytype.c
|
||||
libmisc/tz.c
|
||||
libmisc/ulimit.c
|
||||
libmisc/user_busy.c
|
||||
libmisc/utmp.c
|
||||
libmisc/valid.c
|
||||
libmisc/xgetXXbyYY.c
|
||||
@@ -101,7 +106,9 @@ src/lastlog.c
|
||||
src/login.c
|
||||
src/login_nopam.c
|
||||
src/logoutd.c
|
||||
src/newgidmap.c
|
||||
src/newgrp.c
|
||||
src/newuidmap.c
|
||||
src/newusers.c
|
||||
src/passwd.c
|
||||
src/pwck.c
|
||||
|
||||
22
po/bs.po
22
po/bs.po
@@ -113,12 +113,10 @@ msgid "Cannot init SELinux management\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "Cannot create SELinux user key\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "Cannot verify the SELinux user\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -151,7 +149,6 @@ msgid "%s: out of memory\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: Cannot stat %s: %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -204,7 +201,6 @@ msgid "%s: Cannot change owners of %s: %s\n"
|
||||
msgstr "nepoznata grupa: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: Cannot lstat %s: %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -223,7 +219,6 @@ msgid "%s: mkdir: %s: %s\n"
|
||||
msgstr "nepoznata grupa: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: Cannot open %s: %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -485,7 +480,7 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
" -M, --maxdays MAX_DAYS set maximim number of days before password\n"
|
||||
" -M, --maxdays MAX_DAYS set maximum number of days before password\n"
|
||||
" change to MAX_DAYS\n"
|
||||
msgstr ""
|
||||
|
||||
@@ -575,12 +570,10 @@ msgid "%s: PAM: %s\n"
|
||||
msgstr "nepoznata grupa: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: Try again later\n"
|
||||
msgid "%s: cannot lock %s; try again later.\n"
|
||||
msgstr "%s: Pokušajte ponovo kasnije\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: cannot open %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -1014,7 +1007,6 @@ msgid "%s: -K requires KEY=VALUE\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: group %s exists\n"
|
||||
msgid "%s: group '%s' already exists\n"
|
||||
msgstr "%s: grupa %s postoji\n"
|
||||
|
||||
@@ -1023,7 +1015,6 @@ msgid "%s: GID '%lu' already exists\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: Cannot setup cleanup service.\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -1222,7 +1213,6 @@ msgid "%s: no changes\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: cannot delete %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -1347,7 +1337,6 @@ msgid "Login incorrect"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "Cannot find user (%s)\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -1601,7 +1590,6 @@ msgid "%s: password changed.\n"
|
||||
msgstr "Šifra:"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Password Expiration Warning"
|
||||
msgid "%s: password expiry information changed.\n"
|
||||
msgstr "Upozorenje o isteku šifre"
|
||||
|
||||
@@ -1642,7 +1630,6 @@ msgid "invalid user ID '%lu'\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Adding user %s to group %s\n"
|
||||
msgid "user '%s': no group %lu\n"
|
||||
msgstr "Dodajem korisnika %s grupi %s\n"
|
||||
|
||||
@@ -1667,7 +1654,6 @@ msgid "failed to create tcb directory for %s\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: cannot lock %s.\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -1716,7 +1702,6 @@ msgid "Please enter your OWN password as authentication.\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: Cannot fork user shell\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -1797,7 +1782,6 @@ msgid "%s: Cannot drop the controlling terminal\n"
|
||||
msgstr "nepoznata grupa: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "Cannot execute %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -2093,7 +2077,6 @@ msgid "%s: Can't allocate memory, tcb entry for %s not removed.\n"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: Cannot drop privileges: %s\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
@@ -2150,7 +2133,7 @@ msgstr ""
|
||||
msgid ""
|
||||
" -a, --append append the user to the supplemental GROUPS\n"
|
||||
" mentioned by the -G option without removing\n"
|
||||
" him/her from other groups\n"
|
||||
" the user from other groups\n"
|
||||
msgstr ""
|
||||
|
||||
msgid " -l, --login NEW_LOGIN new value of the login name\n"
|
||||
@@ -2214,7 +2197,6 @@ msgid "%s: invalid subordinate gid range '%s'\n"
|
||||
msgstr "nepoznata grupa: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: unknown member %s\n"
|
||||
msgid "%s: no options\n"
|
||||
msgstr "%s: nepoznat član %s\n"
|
||||
|
||||
|
||||
36
po/ca.po
36
po/ca.po
@@ -46,7 +46,6 @@ msgid "%s: nscd did not terminate normally (signal %d)\n"
|
||||
msgstr "%s: nscd no ha acabat correctament (senyal %d)\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: nscd exited with status %d"
|
||||
msgid "%s: nscd exited with status %d\n"
|
||||
msgstr "%s: «nscd» ha sortit amb l'estat %d"
|
||||
|
||||
@@ -430,7 +429,6 @@ msgid "%s: cannot access chroot directory %s: %s\n"
|
||||
msgstr "%s: no es pot accedir al directori «chroot» %s: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: cannot access chroot directory %s: %s\n"
|
||||
msgid "%s: cannot chdir to chroot directory %s: %s\n"
|
||||
msgstr "%s: no es pot accedir al directori «chroot» %s: %s\n"
|
||||
|
||||
@@ -518,8 +516,9 @@ msgstr ""
|
||||
" -m, --mindays DIES_MÍN estableix el número mínim de dies abans\n"
|
||||
" del canvi de contrasenya a DIES_MÍN\n"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
" -M, --maxdays MAX_DAYS set maximim number of days before password\n"
|
||||
" -M, --maxdays MAX_DAYS set maximum number of days before password\n"
|
||||
" change to MAX_DAYS\n"
|
||||
msgstr ""
|
||||
" -M, --maxdays DIES_MÀX estableix el número màxim de dies abans\n"
|
||||
@@ -808,7 +807,6 @@ msgid "%s: line %d: missing new password\n"
|
||||
msgstr "%s: línia %d: manca la nova contrasenya\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: Failed to write %s: %s\n"
|
||||
msgid "%s: failed to crypt password with salt '%s': %s\n"
|
||||
msgstr "%s: Error en escriure %s: %s\n"
|
||||
|
||||
@@ -1131,8 +1129,6 @@ msgid "%s: Cannot setup cleanup service.\n"
|
||||
msgstr "%s: no es pot configurar el servei de neteja.\n"
|
||||
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| " -r, --reset reset the counters of login failures\n"
|
||||
msgid ""
|
||||
" -f, --force delete group even if it is the primary group "
|
||||
"of a user\n"
|
||||
@@ -1371,8 +1367,6 @@ msgstr ""
|
||||
" antics que DIES\n"
|
||||
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| " -a, --all display faillog records for all users\n"
|
||||
msgid ""
|
||||
" -C, --clear clear lastlog record of an user (usable only "
|
||||
"with -u)\n"
|
||||
@@ -1381,8 +1375,6 @@ msgstr ""
|
||||
"els usuaris\n"
|
||||
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| " -a, --all display faillog records for all users\n"
|
||||
msgid ""
|
||||
" -S, --set set lastlog record to current time (usable "
|
||||
"only with -u)\n"
|
||||
@@ -1412,12 +1404,10 @@ msgid "**Never logged in**"
|
||||
msgstr "**No ha entrat mai**"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: Failed to get the entry for UID %lu\n"
|
||||
msgid "%s: Failed to update the entry for UID %lu\n"
|
||||
msgstr "%s: No s'ha pogut obtenir l'entrada de la UID %lu\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: can't update password file\n"
|
||||
msgid "%s: Failed to update the lastlog file\n"
|
||||
msgstr "%s: no es pot actualitzar el fitxer de contrasenyes\n"
|
||||
|
||||
@@ -1551,7 +1541,6 @@ msgid "Usage: sg group [[-c] command]\n"
|
||||
msgstr "Forma d'ús: sg grup [[-c] ordre]\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: Failed to write %s: %s\n"
|
||||
msgid "%s: failed to crypt password with previous salt: %s\n"
|
||||
msgstr "%s: Error en escriure %s: %s\n"
|
||||
|
||||
@@ -1625,17 +1614,14 @@ msgid "%s: line %d: can't update entry\n"
|
||||
msgstr "%s: línia %d: no es pot actualitzar l'entrada\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: failed to prepare the new %s entry '%s'\n"
|
||||
msgid "%s: failed to prepare new %s entry\n"
|
||||
msgstr "%s: ha fallat la preparació de la nova entrada %s: «%s»\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: can't create user\n"
|
||||
msgid "%s: can't find subordinate user range\n"
|
||||
msgstr "%s: no es pot generar l'usuari\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: can't update group file\n"
|
||||
msgid "%s: can't find subordinate group range\n"
|
||||
msgstr "%s: no es pot actualitzar el fitxer de grups\n"
|
||||
|
||||
@@ -2051,7 +2037,6 @@ msgid "%s: line too long in %s: %s..."
|
||||
msgstr "%s: línia massa llarga a %s: %s..."
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: Cannot create symbolic link %s: %s\n"
|
||||
msgid "%s: Cannot create backup file (%s): %s\n"
|
||||
msgstr "%s: no es pot generar l'enllaç simbòlic %s: %s\n"
|
||||
|
||||
@@ -2226,7 +2211,6 @@ msgid "%s: failed to reset the lastlog entry of UID %lu: %s\n"
|
||||
msgstr "%s: ha fallat el restabliment del darrer registre de UID %lu: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: failed to prepare the new %s entry '%s'\n"
|
||||
msgid "%s: failed to prepare the new %s entry\n"
|
||||
msgstr "%s: ha fallat la preparació de la nova entrada %s: «%s»\n"
|
||||
|
||||
@@ -2274,12 +2258,10 @@ msgid "%s: can't create group\n"
|
||||
msgstr "%s: no es pot generar el grup\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: can't create user\n"
|
||||
msgid "%s: can't create subordinate user IDs\n"
|
||||
msgstr "%s: no es pot generar l'usuari\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: can't create group\n"
|
||||
msgid "%s: can't create subordinate group IDs\n"
|
||||
msgstr "%s: no es pot generar el grup\n"
|
||||
|
||||
@@ -2333,7 +2315,6 @@ msgstr ""
|
||||
"usuari.\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: cannot remove entry '%s' from %s\n"
|
||||
msgid "%s: cannot remove entry %lu from %s\n"
|
||||
msgstr "%s: no es pot eliminar l'entrada «%s» de %s\n"
|
||||
|
||||
@@ -2423,7 +2404,7 @@ msgstr " -G, --groups GRUPS llista de GRUPS addicionals\n"
|
||||
msgid ""
|
||||
" -a, --append append the user to the supplemental GROUPS\n"
|
||||
" mentioned by the -G option without removing\n"
|
||||
" him/her from other groups\n"
|
||||
" the user from other groups\n"
|
||||
msgstr ""
|
||||
" -a, --append afegeix l'usuari als GRUPS addicionals\n"
|
||||
" llistats amb la opció -G sense eliminar-los\n"
|
||||
@@ -2492,12 +2473,10 @@ msgid "%s: user '%s' already exists in %s\n"
|
||||
msgstr "%s: l'usuari «%s» ja existeix a %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: invalid date '%s'\n"
|
||||
msgid "%s: invalid subordinate uid range '%s'\n"
|
||||
msgstr "%s: la data «%s» no és vàlida\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: invalid date '%s'\n"
|
||||
msgid "%s: invalid subordinate gid range '%s'\n"
|
||||
msgstr "%s: la data «%s» no és vàlida\n"
|
||||
|
||||
@@ -2518,7 +2497,6 @@ msgid "%s: UID '%lu' already exists\n"
|
||||
msgstr "%s: UID '%lu' ja existeix\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: %s is not authorized to change the password of %s\n"
|
||||
msgid "%s: %s does not exist, you cannot use the flags %s or %s\n"
|
||||
msgstr "%s: %s no està autoritzat per canviar la contrasenya de %s\n"
|
||||
|
||||
@@ -2570,22 +2548,18 @@ msgid "failed to rename mailbox"
|
||||
msgstr "no s'ha pogut reanomenar la bústia de correu"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: failed to prepare the new %s entry '%s'\n"
|
||||
msgid "%s: failed to remove uid range %lu-%lu from '%s'\n"
|
||||
msgstr "%s: ha fallat la preparació de la nova entrada %s: «%s»\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: failed to prepare the new %s entry '%s'\n"
|
||||
msgid "%s: failed to add uid range %lu-%lu from '%s'\n"
|
||||
msgstr "%s: ha fallat la preparació de la nova entrada %s: «%s»\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: failed to prepare the new %s entry '%s'\n"
|
||||
msgid "%s: failed to remove gid range %lu-%lu from '%s'\n"
|
||||
msgstr "%s: ha fallat la preparació de la nova entrada %s: «%s»\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: failed to prepare the new %s entry '%s'\n"
|
||||
msgid "%s: failed to add gid range %lu-%lu from '%s'\n"
|
||||
msgstr "%s: ha fallat la preparació de la nova entrada %s: «%s»\n"
|
||||
|
||||
@@ -2645,12 +2619,10 @@ msgid "Couldn't make backup"
|
||||
msgstr "No s'ha pogut fer una còpia de seguretat"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: PAM: %s\n"
|
||||
msgid "%s: %s: %s\n"
|
||||
msgstr "%s: PAM: %s\n"
|
||||
|
||||
#, fuzzy, c-format
|
||||
#| msgid "%s: nscd exited with status %d"
|
||||
msgid "%s: %s returned with status %d\n"
|
||||
msgstr "%s: «nscd» ha sortit amb l'estat %d"
|
||||
|
||||
@@ -2968,7 +2940,7 @@ msgstr "%s: no es pot trobar el directori «tcb» per %s\n"
|
||||
#~ "GROUPS\n"
|
||||
#~ " mentioned by the -G option without "
|
||||
#~ "removing\n"
|
||||
#~ " him/her from other groups\n"
|
||||
#~ " the user from other groups\n"
|
||||
#~ " -h, --help display this help message and exit\n"
|
||||
#~ " -l, --login NEW_LOGIN new value of the login name\n"
|
||||
#~ " -L, --lock lock the user account\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user