diff --git a/debian/patches/1000_configure_userns b/debian/patches/1000_configure_userns deleted file mode 100644 index 5cd39b61..00000000 --- a/debian/patches/1000_configure_userns +++ /dev/null @@ -1,93 +0,0 @@ -=== modified file 'etc/login.defs' -Index: git/etc/login.defs -=================================================================== ---- git.orig/etc/login.defs -+++ git/etc/login.defs -@@ -229,7 +229,7 @@ - # Extra per user uids - SUB_UID_MIN 100000 - SUB_UID_MAX 600100000 --SUB_UID_COUNT 10000 -+SUB_UID_COUNT 65536 - - # - # Min/max values for automatic gid selection in groupadd(8) -@@ -242,7 +242,7 @@ - # Extra per user group ids - SUB_GID_MIN 100000 - SUB_GID_MAX 600100000 --SUB_GID_COUNT 10000 -+SUB_GID_COUNT 65536 - - # - # Max number of login(1) retries if password is bad -Index: git/src/newusers.c -=================================================================== ---- git.orig/src/newusers.c -+++ git/src/newusers.c -@@ -988,8 +988,8 @@ - is_shadow_grp = sgr_file_present (); - #endif - #ifdef ENABLE_SUBIDS -- is_sub_uid = sub_uid_file_present (); -- is_sub_gid = sub_gid_file_present (); -+ is_sub_uid = sub_uid_file_present () && !rflg; -+ is_sub_gid = sub_gid_file_present () && !rflg; - #endif /* ENABLE_SUBIDS */ - - open_files (); -Index: git/src/useradd.c -=================================================================== ---- git.orig/src/useradd.c -+++ git/src/useradd.c -@@ -1994,6 +1994,10 @@ - #endif /* USE_PAM */ - #endif /* ACCT_TOOLS_SETUID */ - -+ /* Needed for userns check */ -+ uid_t uid_min = (uid_t) getdef_ulong ("UID_MIN", 1000UL); -+ uid_t uid_max = (uid_t) getdef_ulong ("UID_MAX", 60000UL); -+ - /* - * Get my name so that I can use it to report errors. - */ -@@ -2023,8 +2027,10 @@ - is_shadow_grp = sgr_file_present (); - #endif - #ifdef ENABLE_SUBIDS -- is_sub_uid = sub_uid_file_present (); -- is_sub_gid = sub_gid_file_present (); -+ is_sub_uid = sub_uid_file_present () && !rflg && -+ (!user_id || (user_id <= uid_max && user_id >= uid_min)); -+ is_sub_gid = sub_gid_file_present () && !rflg && -+ (!user_id || (user_id <= uid_max && user_id >= uid_min)); - #endif /* ENABLE_SUBIDS */ - - get_defaults (); - -Index: git/libmisc/find_new_sub_uids.c -=================================================================== ---- git.orig/libmisc/find_new_sub_uids.c -+++ git/libmisc/find_new_sub_uids.c -@@ -58,7 +58,7 @@ - - min = getdef_ulong ("SUB_UID_MIN", 100000UL); - max = getdef_ulong ("SUB_UID_MAX", 600100000UL); -- count = getdef_ulong ("SUB_UID_COUNT", 10000); -+ count = getdef_ulong ("SUB_UID_COUNT", 65536); - - if (min > max || count >= max || (min + count - 1) > max) { - (void) fprintf (stderr, -Index: git/libmisc/find_new_sub_gids.c -=================================================================== ---- git.orig/libmisc/find_new_sub_gids.c -+++ git/libmisc/find_new_sub_gids.c -@@ -58,7 +58,7 @@ - - min = getdef_ulong ("SUB_GID_MIN", 100000UL); - max = getdef_ulong ("SUB_GID_MAX", 600100000UL); -- count = getdef_ulong ("SUB_GID_COUNT", 10000); -+ count = getdef_ulong ("SUB_GID_COUNT", 65536); - - if (min > max || count >= max || (min + count - 1) > max) { - (void) fprintf (stderr, diff --git a/debian/patches/1010_vietnamese_translation b/debian/patches/1010_vietnamese_translation deleted file mode 100644 index f3331d33..00000000 --- a/debian/patches/1010_vietnamese_translation +++ /dev/null @@ -1,2687 +0,0 @@ -Index: git/po/vi.po -=================================================================== ---- git.orig/po/vi.po -+++ git/po/vi.po -@@ -1,15 +1,17 @@ - # Vietnamese translation for Shadow. --# Copyright © 2009 Free Software Foundation, Inc. -+# Bản dịch tiếng Việt dành cho shadow. -+# Copyright © 2014 Free Software Foundation, Inc. - # Clytie Siddall , 2005-2008. -+# Trần Ngọc Quân , 2014. - # - msgid "" - msgstr "" - "Project-Id-Version: shadow\n" - "Report-Msgid-Bugs-To: pkg-shadow-devel@lists.alioth.debian.org\n" - "POT-Creation-Date: 2012-05-20 19:52+0200\n" --"PO-Revision-Date: 2012-01-08 18:13+0100\n" --"Last-Translator: Clytie Siddall \n" --"Language-Team: Vietnamese \n" -+"PO-Revision-Date: 2014-04-11 15:01+0700\n" -+"Last-Translator: Trần Ngọc Quân \n" -+"Language-Team: Vietnamese \n" - "Language: vi\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" -@@ -21,34 +23,34 @@ - msgid "" - "Multiple entries named '%s' in %s. Please fix this with pwck or grpck.\n" - msgstr "" --"Có nhiều mục nhập tên « %s » trong %s. Hãy sửa chữa trường hợp này, dùng " -+"Có nhiều mục tin mang tên “%s” trong %s. Hãy sửa chữa trường hợp này, dùng " - "pwck hoặc grpck.\n" - - #, c-format - msgid "crypt method not supported by libcrypt? (%s)\n" --msgstr "Phương pháp mã hoá không được libcrypt hỗ trợ ? (%s)\n" -+msgstr "Phương pháp mã hoá không được thư viện libcrypt hỗ trợ? (%s)\n" - - #, c-format - msgid "configuration error - cannot parse %s value: '%s'" --msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: « %s »" -+msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: “%s”" - - msgid "Could not allocate space for config info.\n" - msgstr "Không thể cấp phát sức chứa cho thông tin cấu hình.\n" - - #, c-format - msgid "configuration error - unknown item '%s' (notify administrator)\n" --msgstr "lỗi cấu hình: không rõ mục « %s » (báo quản trị).\n" -+msgstr "lỗi cấu hình - không hiểu mục tin “%s” (báo cho người quản trị).\n" - - #, c-format - msgid "%s: nscd did not terminate normally (signal %d)\n" --msgstr "" -+msgstr "%s: nscd đã kết thúc bất thường (tín hiệu %d)\n" - - #, c-format - msgid "%s: nscd exited with status %d\n" --msgstr "" -+msgstr "%s: nscd đã thoát với mã là %d\n" - - msgid "Password: " --msgstr "Mật khẩu : " -+msgstr "Mật khẩu: " - - #, c-format - msgid "%s's Password: " -@@ -56,212 +58,198 @@ - - #, c-format - msgid "[libsemanage]: %s\n" --msgstr "" -+msgstr "[libsemanage]: %s\n" - - #, c-format - msgid "Cannot create SELinux management handle\n" --msgstr "" -+msgstr "Không thể tạo bộ tiếp hợp quản lý SELinux\n" - - #, c-format - msgid "SELinux policy not managed\n" --msgstr "" -+msgstr "Chính sách cho SELinux chưa được quản lý\n" - - #, c-format - msgid "Cannot read SELinux policy store\n" --msgstr "" -+msgstr "Không thể đọc kho lưu chính sách SELinux\n" - - #, c-format - msgid "Cannot establish SELinux management connection\n" --msgstr "" -+msgstr "Không thể thiết lập kết nối quản lý SELinux\n" - - #, c-format - msgid "Cannot begin SELinux transaction\n" --msgstr "" -+msgstr "Không thể bắt đầu phiên giao dịch SELinux\n" - - #, c-format - msgid "Could not query seuser for %s\n" --msgstr "" -+msgstr "Không thể truy vấn seuser cho %s\n" - - #, c-format - msgid "Could not set serange for %s\n" --msgstr "" -+msgstr "Không thể đặt serange cho %s\n" - --#, fuzzy, c-format --#| msgid "Could not allocate space for config info.\n" -+#, c-format - msgid "Could not set sename for %s\n" --msgstr "Không thể cấp phát sức chứa cho thông tin cấu hình.\n" -+msgstr "Không thể đặt sename cho %s\n" - - #, c-format - msgid "Could not modify login mapping for %s\n" --msgstr "" -+msgstr "Không thể sửa đổi ánh xạ đăng nhập cho %s\n" - --#, fuzzy, c-format --#| msgid "Changing the aging information for %s\n" -+#, c-format - msgid "Cannot create SELinux login mapping for %s\n" --msgstr "Đang thay đổi thông tin về thời gian hoạt động đối với %s\n" -+msgstr "Không thể tạo ánh xạ đăng nhập SELinux cho %s\n" - - #, c-format - msgid "Could not set name for %s\n" --msgstr "" -+msgstr "Không thể đặt tên %s\n" - - #, c-format - msgid "Could not set SELinux user for %s\n" --msgstr "" -+msgstr "Không thể đặt người dùng SELinux cho %s\n" - - #, c-format - msgid "Could not add login mapping for %s\n" --msgstr "" -+msgstr "Không thể thêm ánh xạ đăng nhập cho %s\n" - - #, c-format - msgid "Cannot init SELinux management\n" --msgstr "" -+msgstr "Không thể khởi tạo bộ quản lý SELinux\n" - --#, fuzzy, c-format --#| msgid "%s: Cannot determine your user name.\n" -+#, c-format - msgid "Cannot create SELinux user key\n" --msgstr "%s: không thể quyết định tên người dùng của bạn.\n" -+msgstr "Không thể tạo khóa người dùng SELinux\n" - --#, fuzzy, c-format --#| msgid "%s: Cannot determine your user name.\n" -+#, c-format - msgid "Cannot verify the SELinux user\n" --msgstr "%s: không thể quyết định tên người dùng của bạn.\n" -+msgstr "Không thể thẩm định người dùng SELinux\n" - - #, c-format - msgid "Cannot modify SELinux user mapping\n" --msgstr "" -+msgstr "Không thể sửa đổi ánh xạ người dùng SELinux\n" - - #, c-format - msgid "Cannot add SELinux user mapping\n" --msgstr "" -+msgstr "Không thể thêm ánh xạ người dùng SELinux\n" - - #, c-format - msgid "Cannot commit SELinux transaction\n" --msgstr "" -+msgstr "Không thể chuyển giao giao dịch SELinux\n" - - #, c-format - msgid "Login mapping for %s is not defined, OK if default mapping was used\n" - msgstr "" -+"Ánh xạ đăng nhập cho %s chưa được định nghĩa, OK nếu ánh xạ mặc định được " -+"dùng\n" - - #, c-format - msgid "Login mapping for %s is defined in policy, cannot be deleted\n" - msgstr "" -+"Ánh xạ đăng nhập cho %s được định nghĩa trong chính sách, không thể xóa đi\n" - - #, c-format - msgid "Could not delete login mapping for %s" --msgstr "" -+msgstr "Không thể xóa ánh xạ đăng nhập cho %s" - - #, c-format - msgid "%s: out of memory\n" --msgstr "%s: tràn bộ nhớ\n" -+msgstr "%s: hết bộ nhớ\n" - --#, fuzzy, c-format --#| msgid "%s: cannot delete %s\n" -+#, c-format - msgid "%s: Cannot stat %s: %s\n" --msgstr "%s: không thể xoá %s\n" -+msgstr "%s: Không thể lấy thống kê về %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: %s home directory (%s) not found\n" -+#, c-format - msgid "%s: %s is neither a directory, nor a symlink.\n" --msgstr "%s: %s không tìm thấy thư mục chính (%s)\n" -+msgstr "%s: %s không phải là thư mục mà cũng không phải là liên kết mềm.\n" - --#, fuzzy, c-format --#| msgid "%s: cannot remove entry '%s' from %s\n" -+#, c-format - msgid "%s: Cannot read symbolic link %s: %s\n" --msgstr "%s: không thể gỡ bỏ mục nhập « %s » khỏi %s\n" -+msgstr "%s: Không thể đọc liên kết mềm %s: %s\n" - - #, c-format - msgid "%s: Suspiciously long symlink: %s\n" --msgstr "" -+msgstr "%s: Liên kết mềm dài một cách điên rồ: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: Cannot create directory %s: %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: Không thể tạo thư mục %s: %s\n" - --#, fuzzy, c-format --#| msgid "lastlog: Cannot get the size of %s: %s\n" -+#, c-format - msgid "%s: Cannot change owner of %s: %s\n" --msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n" -+msgstr "%s: Không thể thay đổi người sở hữu của %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: warning: can't remove %s: %s\n" -+#, c-format - msgid "%s: Cannot change mode of %s: %s\n" --msgstr "%s: cảnh báo : không thể gỡ bỏ %s: %s\n" -+msgstr "%s: Không thể thay đổi chế độ của %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: rename: %s: %s" -+#, c-format - msgid "%s: unlink: %s: %s\n" --msgstr "%s: thay tên: %s: %s" -+msgstr "%s: unlink: %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot rename directory %s to %s\n" -+#, c-format - msgid "%s: Cannot remove directory %s: %s\n" --msgstr "%s: không thể thay đổi lại tên thư mục %s thành %s\n" -+msgstr "%s: Không thể gỡ bỏ thư mục %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot rename directory %s to %s\n" -+#, c-format - msgid "%s: Cannot rename %s to %s: %s\n" --msgstr "%s: không thể thay đổi lại tên thư mục %s thành %s\n" -+msgstr "%s: Không thể đổi tên %s thành %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: warning: can't remove %s: %s\n" -+#, c-format - msgid "%s: Cannot remove %s: %s\n" --msgstr "%s: cảnh báo : không thể gỡ bỏ %s: %s\n" -+msgstr "%s: Không thể gỡ bỏ %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: Cannot create symbolic link %s: %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: Không thể tạo liên kết mềm %s: %s\n" - --#, fuzzy, c-format --#| msgid "lastlog: Cannot get the size of %s: %s\n" -+#, c-format - msgid "%s: Cannot change owners of %s: %s\n" --msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n" -+msgstr "%s: Không thể thay đổi chủ sở hữu của %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot delete %s\n" -+#, c-format - msgid "%s: Cannot lstat %s: %s\n" --msgstr "%s: không thể xoá %s\n" -+msgstr "%s: Không thể lstat %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: (line %d, user %s) password not changed\n" -+#, c-format - msgid "%s: Warning, user %s has no tcb shadow file.\n" --msgstr "%s: (dòng %d, người dùng %s) mật khẩu chưa thay đổi\n" -+msgstr "%s: Cảnh báo, người dùng %s không có tập tin shadow tcb.\n" - - #, c-format - msgid "" - "%s: Emergency: %s's tcb shadow is not a regular file with st_nlink=1.\n" - "The account is left locked.\n" - msgstr "" -+"%s: Khẩn cấp: shadow tcb của %s không phải là tập tin thường với " -+"st_nlink=1.\n" -+"Tài khoản vẫn bị khóa.\n" - --#, fuzzy, c-format --#| msgid "%s: rename: %s: %s" -+#, c-format - msgid "%s: mkdir: %s: %s\n" --msgstr "%s: thay tên: %s: %s" -+msgstr "%s: mkdir: %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot open %s\n" -+#, c-format - msgid "%s: Cannot open %s: %s\n" --msgstr "%s: không thể mở %s\n" -+msgstr "%s: Không thể mở %s: %s\n" - - #, c-format - msgid "Warning: unknown group %s\n" --msgstr "Cảnh báo : không rõ nhóm %s.\n" -+msgstr "Cảnh báo: không biết nhóm %s.\n" - - msgid "Warning: too many groups\n" --msgstr "Cảnh báo : quá nhiều nhóm\n" -+msgstr "Cảnh báo: quá nhiều nhóm\n" - - msgid "Your password has expired." - msgstr "Mật khẩu của bạn đã hết hạn dùng." - - msgid "Your password is inactive." --msgstr "Mật khẩu của bạn không phải hoạt động." -+msgstr "Mật khẩu của bạn là không hoạt động." - - msgid "Your login has expired." - msgstr "Đăng nhập của bạn đã hết hạn dùng." - - msgid " Contact the system administrator." --msgstr " Hãy liên lạc với quản trị hệ thống." -+msgstr " Hãy liên lạc với người quản trị hệ thống." - - msgid " Choose a new password." - msgstr " Hãy chọn mật khẩu mới." -@@ -291,13 +279,12 @@ - msgid "%s: failed to unlock %s\n" - msgstr "%s: lỗi mở khoá %s\n" - --#, fuzzy, c-format --#| msgid "%s: %s\n" -+#, c-format - msgid "%s: " --msgstr "%s: %s\n" -+msgstr "%s: " - - msgid ": " --msgstr "" -+msgstr ": " - - msgid "Environment overflow\n" - msgstr "Tràn môi trường\n" -@@ -319,18 +306,19 @@ - - #, c-format - msgid "%s: Invalid configuration: GID_MIN (%lu), GID_MAX (%lu)\n" --msgstr "" -+msgstr "%s: Cấu hình không hợp lệ: GID_MIN (%lu), GID_MAX (%lu)\n" - - #, c-format - msgid "" - "%s: Invalid configuration: SYS_GID_MIN (%lu), GID_MIN (%lu), SYS_GID_MAX " - "(%lu)\n" - msgstr "" -+"%s: Cấu hình không hợp lệ: SYS_GID_MIN (%lu), GID_MIN (%lu), SYS_GID_MAX " -+"(%lu)\n" - --#, fuzzy, c-format --#| msgid "failed to change mailbox owner" -+#, c-format - msgid "%s: failed to allocate memory: %s\n" --msgstr "lỗi thay đổi chủ hộp thư" -+msgstr "%s: gặp lỗi khi cấp phát bộ nhớ: %s\n" - - #, c-format - msgid "%s: Can't get unique system GID (no more available GIDs)\n" -@@ -343,13 +331,15 @@ - - #, c-format - msgid "%s: Invalid configuration: UID_MIN (%lu), UID_MAX (%lu)\n" --msgstr "" -+msgstr "%s: Cấu hình không hợp lệ: UID_MIN (%lu), UID_MAX (%lu)\n" - - #, c-format - msgid "" - "%s: Invalid configuration: SYS_UID_MIN (%lu), UID_MIN (%lu), SYS_UID_MAX " - "(%lu)\n" - msgstr "" -+"%s: Cấu hình không hợp lệ: SYS_UID_MIN (%lu), UID_MIN (%lu), SYS_UID_MAX " -+"(%lu)\n" - - #, c-format - msgid "%s: Can't get unique system UID (no more available UIDs)\n" -@@ -379,7 +369,7 @@ - msgstr "từ đọc xuôi ngược đều giống như nhau" - - msgid "case changes only" --msgstr "chỉ thay đổi chữ thường/hoa" -+msgstr "chỉ thay đổi HOA/thường" - - msgid "too similar" - msgstr "quá tương tự" -@@ -403,10 +393,10 @@ - - #, c-format - msgid "passwd: %s\n" --msgstr "passwd: (mật khẩu) %s\n" -+msgstr "passwd: %s\n" - - msgid "passwd: password unchanged\n" --msgstr "passwd: chưa thay đổi mật khẩu\n" -+msgstr "passwd: chưa đổi mật khẩu\n" - - msgid "passwd: password updated successfully\n" - msgstr "passwd: mật khẩu đã được cập nhật\n" -@@ -417,45 +407,42 @@ - - #, c-format - msgid "%s: multiple --root options\n" --msgstr "" -+msgstr "%s: nhiều tùy chọn --root\n" - - #, c-format - msgid "%s: option '%s' requires an argument\n" --msgstr "" -+msgstr "%s: tùy chọn “%s” cần một đối số\n" - - #, c-format - msgid "%s: failed to drop privileges (%s)\n" --msgstr "%s: lỗi bỏ quyền truy cập (%s)\n" -+msgstr "%s: gặp lỗi khi xóa bỏ đặc quyền (%s)\n" - --#, fuzzy, c-format --#| msgid "%s: invalid home phone: '%s'\n" -+#, c-format - msgid "%s: invalid chroot path '%s'\n" --msgstr "%s: số điện thoại ở nhà không hợp lệ: « %s »\n" -+msgstr "%s: đường dẫn chroot không hợp lệ “%s”\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: cannot access chroot directory %s: %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: không thể truy cập thư mục chroot %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: unable to chroot to directory %s: %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: không thể thay đổi thư mục gốc thành %s: %s\n" - - #, c-format - msgid "" - "Invalid ENCRYPT_METHOD value: '%s'.\n" - "Defaulting to DES.\n" - msgstr "" --"Phương pháp mã hoá (ENCRYPT_METHOD) không hợp lệ: « %s »\n" -+"Phương pháp mã hoá (ENCRYPT_METHOD) không hợp lệ: “%s”\n" - "nên hoàn nguyên về giá trị mặc định: DES.\n" - - #, c-format - msgid "Unable to cd to '%s'\n" --msgstr "Không thể cd (chuyển đổi thư mục) sang « %s ».\n" -+msgstr "Không thể cd (chuyển đổi thư mục) sang “%s”.\n" - - msgid "No directory, logging in with HOME=/" --msgstr "Không có thư mục nên đăng nhập với « HOME=/ »" -+msgstr "Không có thư mục nên đăng nhập với “HOME=/”" - - #, c-format - msgid "Cannot execute %s" -@@ -463,11 +450,11 @@ - - #, c-format - msgid "Invalid root directory '%s'\n" --msgstr "Thư mục gốc không hợp lệ « %s »\n" -+msgstr "Thư mục gốc không hợp lệ “%s”\n" - - #, c-format - msgid "Can't change root directory to '%s'\n" --msgstr "Không thể thay đổi thư mục gốc thành « %s »\n" -+msgstr "Không thể thay đổi thư mục gốc thành “%s”\n" - - msgid "Unable to determine your tty name." - msgstr "Không thể quyết định tên TTY của bạn." -@@ -481,7 +468,7 @@ - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n" -+"Cách dùng: %s [các_tuỳ_chọn] ĐĂNG_NHẬP\n" - "\n" - "Tuỳ chọn:\n" - -@@ -529,12 +516,12 @@ - "khi thay đổi mật khẩu\n" - - msgid " -R, --root CHROOT_DIR directory to chroot into\n" --msgstr "" -+msgstr " -R, --root THƯ_MỤC_ĐỔI thư mục để chuyển gốc đến\n" - - msgid "" - " -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS\n" - msgstr "" --" -W, --warndays SỐ đặt thành số này số các ngày gây ra cảnh báo " -+" -W, --warndays SỐ_NGÀY đặt thành số này số các ngày gây ra cảnh báo " - "về hết hạn dùng\n" - - msgid "Enter the new value, or press ENTER for the default" -@@ -574,7 +561,7 @@ - msgstr "Mật khẩu không hoạt động\t\t\t\t\t: " - - msgid "Account expires\t\t\t\t\t\t: " --msgstr "Tài khoản hết hạn dùng\t\t\t\t\t\t " -+msgstr "Tài khoản hết hạn dùng\t\t\t\t\t\t: " - - #, c-format - msgid "Minimum number of days between password change\t\t: %ld\n" -@@ -590,15 +577,15 @@ - - #, c-format - msgid "%s: invalid date '%s'\n" --msgstr "%s: ngày không hợp lệ « %s »\n" -+msgstr "%s: ngày không hợp lệ “%s”\n" - - #, c-format - msgid "%s: invalid numeric argument '%s'\n" --msgstr "%s: đối số thuộc số không hợp lệ « %s »\n" -+msgstr "%s: đối số thuộc số không hợp lệ “%s”\n" - - #, c-format - msgid "%s: do not include \"l\" with other flags\n" --msgstr "%s: đừng dùng « l » cùng với cờ khác\n" -+msgstr "%s: đừng dùng “l” cùng với cờ khác\n" - - #, c-format - msgid "%s: Permission denied.\n" -@@ -606,12 +593,11 @@ - - #, c-format - msgid "%s: Cannot determine your user name.\n" --msgstr "%s: không thể quyết định tên người dùng của bạn.\n" -+msgstr "%s: Không thể phân giải tên người dùng của bạn.\n" - --#, fuzzy, c-format --#| msgid "%s: %s\n" -+#, c-format - msgid "%s: PAM: %s\n" --msgstr "%s: %s\n" -+msgstr "%s: PAM: %s\n" - - #, c-format - msgid "%s: cannot lock %s; try again later.\n" -@@ -627,15 +613,15 @@ - - #, c-format - msgid "%s: failed to prepare the new %s entry '%s'\n" --msgstr "%s: lỗi chuẩn bị mục nhập %s mới « %s »\n" -+msgstr "%s: gặp lỗi khi chuẩn bị mục tin %s mới “%s”\n" - - #, c-format - msgid "%s: the shadow password file is not present\n" --msgstr "%s: không có tập tin mật khẩu bóng\n" -+msgstr "%s: không có tập tin mật khẩu shadow\n" - - #, c-format - msgid "%s: user '%s' does not exist in %s\n" --msgstr "%s: người dùng « %s » không tồn tại trong %s\n" -+msgstr "%s: người dùng “%s” không tồn tại trong %s\n" - - #, c-format - msgid "Changing the aging information for %s\n" -@@ -645,47 +631,45 @@ - msgid "%s: error changing fields\n" - msgstr "%s: gặp lỗi khi thay đổi trường\n" - --#, fuzzy, c-format --#| msgid "" --#| "Usage: %s [options]\n" --#| "\n" --#| "Options:\n" -+#, c-format - msgid "" - "Usage: %s [options] [LOGIN]\n" - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n" - "\n" - "Tuỳ chọn:\n" - - msgid " -f, --full-name FULL_NAME change user's full name\n" --msgstr "" -+msgstr " -f, --full-name HỌ_TÊN đổi tên thật của người dùng\n" - - msgid " -h, --home-phone HOME_PHONE change user's home phone number\n" --msgstr "" -+msgstr " -h, --home-phone ĐIỆN_THOẠI đổi số điện thoại nhà của người dùng\n" - - msgid " -o, --other OTHER_INFO change user's other GECOS information\n" --msgstr "" -+msgstr " -o, --other THÔNG_TIN_KHÁC đổi thông tin GECOS khác\n" - - msgid " -r, --room ROOM_NUMBER change user's room number\n" --msgstr "" -+msgstr " -r, --room SỐ_PHÒNG đổi số phòng của người dùng\n" - - msgid " -u, --help display this help message and exit\n" - msgstr " -u, --help hiển thị trợ giúp này, sau đó thoát\n" - - msgid " -w, --work-phone WORK_PHONE change user's office phone number\n" - msgstr "" -+" -w, --work-phone ĐIỆN_THOẠI_LÀM thay đổi số điện thoại nơi làm của người " -+"dùng\n" - - msgid "Full Name" --msgstr "Họ tên" -+msgstr "Họ và tên" - - #, c-format - msgid "\t%s: %s\n" - msgstr "\t%s: %s\n" - - msgid "Room Number" --msgstr "Số thứ tự phòng" -+msgstr "Số phòng" - - msgid "Work Phone" - msgstr "Điện thoại chỗ làm" -@@ -697,51 +681,51 @@ - msgstr "Khác" - - msgid "Cannot change ID to root.\n" --msgstr "Không thể thay đổi mã số thành người chủ (root).\n" -+msgstr "Không thể thay đổi mã số thành siêu quản trị (root).\n" - - #, c-format - msgid "%s: name with non-ASCII characters: '%s'\n" --msgstr "%s: tên chứa ký tự khác ASCII: « %s »\n" -+msgstr "%s: tên chứa ký tự khác ASCII: “%s”\n" - - #, c-format - msgid "%s: invalid name: '%s'\n" --msgstr "%s: tên không hợp lệ: « %s »\n" -+msgstr "%s: tên không hợp lệ: “%s”\n" - - #, c-format - msgid "%s: room number with non-ASCII characters: '%s'\n" --msgstr "%s: số thứ tự phòng chứa ký tự khác ASCII: « %s »\n" -+msgstr "%s: số thứ tự phòng chứa ký tự khác ASCII: “%s”\n" - - #, c-format - msgid "%s: invalid room number: '%s'\n" --msgstr "%s: số thứ tự phòng không hợp lệ: « %s »\n" -+msgstr "%s: số thứ tự phòng không hợp lệ: “%s”\n" - - #, c-format - msgid "%s: invalid work phone: '%s'\n" --msgstr "%s: số điện thoại chỗ làm không hợp lệ: « %s »\n" -+msgstr "%s: số điện thoại chỗ làm không hợp lệ: “%s”\n" - - #, c-format - msgid "%s: invalid home phone: '%s'\n" --msgstr "%s: số điện thoại ở nhà không hợp lệ: « %s »\n" -+msgstr "%s: số điện thoại ở nhà không hợp lệ: “%s”\n" - - #, c-format - msgid "%s: '%s' contains non-ASCII characters\n" --msgstr "%s: « %s » chứa ký tự khác ASCII\n" -+msgstr "%s: “%s” chứa ký tự không thuộc bảng mã ASCII\n" - - #, c-format - msgid "%s: '%s' contains illegal characters\n" --msgstr "%s: « %s » chứa ký tự cấm\n" -+msgstr "%s: “%s” chứa ký tự bị cấm\n" - - #, c-format - msgid "%s: user '%s' does not exist\n" --msgstr "%s: người dùng « %s » không tồn tại\n" -+msgstr "%s: người dùng “%s” không tồn tại\n" - - #, c-format - msgid "%s: cannot change user '%s' on NIS client.\n" --msgstr "%s: không thể thay đổi người dùng « %s » trên ứng dụng khách NIS.\n" -+msgstr "%s: không thể thay đổi người dùng “%s” trên ứng dụng khách NIS.\n" - - #, c-format - msgid "%s: '%s' is the NIS master for this client.\n" --msgstr "%s: « %s » là NIS cái cho ứng dụng khách này.\n" -+msgstr "%s: “%s” là NIS cái cho ứng dụng khách này.\n" - - #, c-format - msgid "Changing the user information for %s\n" -@@ -757,14 +741,13 @@ - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [tuỳ_chọn ...]\n" - "\n" - "Tuỳ chọn:\n" - --#, fuzzy, c-format --#| msgid " -c, --crypt-method the crypt method (one of %s)\n" -+#, c-format - msgid " -c, --crypt-method METHOD the crypt method (one of %s)\n" --msgstr " -c, --crypt-method phương pháp mật mã (một của %s)\n" -+msgstr " -c, --crypt-method PHƯƠNG_THỨC phương pháp mật mã (một trong %s)\n" - - msgid " -e, --encrypted supplied passwords are encrypted\n" - msgstr "" -@@ -789,11 +772,11 @@ - - #, c-format - msgid "%s: the -c, -e, and -m flags are exclusive\n" --msgstr "%s: các cờ « -c », « -e » và « -m » loại từ lẫn nhau\n" -+msgstr "%s: các cờ “-c”, “-e” và “-m” loại từ lẫn nhau\n" - - #, c-format - msgid "%s: unsupported crypt method: %s\n" --msgstr "%s: phương pháp mã hoá không được hỗ trợ : %s\n" -+msgstr "%s: phương pháp mã hoá không được hỗ trợ: %s\n" - - #, c-format - msgid "%s: line %d: line too long\n" -@@ -805,11 +788,11 @@ - - #, c-format - msgid "%s: line %d: group '%s' does not exist\n" --msgstr "%s: dòng %d, nhóm « %s » không tồn tại\n" -+msgstr "%s: dòng %d, nhóm “%s” không tồn tại\n" - - #, c-format - msgid "%s: line %d: failed to prepare the new %s entry '%s'\n" --msgstr "%s: dòng %d: lỗi chuẩn bị mục nhập %s mới « %s »\n" -+msgstr "%s: dòng %d: gặp lỗi khi chuẩn bị mục tin %s mới “%s”\n" - - #, c-format - msgid "%s: error detected, changes ignored\n" -@@ -821,51 +804,51 @@ - - #, c-format - msgid "%s: line %d: user '%s' does not exist\n" --msgstr "%s: dòng %d: người dùng « %s » không tồn tại\n" -+msgstr "%s: dòng %d: người dùng “%s” không tồn tại\n" - - msgid " -s, --shell SHELL new login shell for the user account\n" - msgstr "" --" -s, --shell TRÌNH_BAO trình bao đăng nhập mới\n" --" cho tài khoản người dùng\n" -+" -s, --shell HỆ_VỎ dùng hệ vỏ đăng nhập mới\n" -+" cho tài khoản người dùng\n" - - msgid "Login Shell" --msgstr "Trình bao Đăng nhập" -+msgstr "Hệ vỏ Đăng nhập" - - #, c-format - msgid "You may not change the shell for '%s'.\n" --msgstr "Không cho phép bạn thay đổi trình bao đối với « %s ».\n" -+msgstr "Không cho phép bạn thay đổi hệ vỏ đối với “%s”.\n" - - #, c-format - msgid "Changing the login shell for %s\n" --msgstr "Đang thay đổi trình bao đăng nhập đối với %s\n" -+msgstr "Đang thay đổi hệ vỏ đăng nhập đối với %s\n" - - #, c-format - msgid "%s: Invalid entry: %s\n" --msgstr "%s: Mục nhập không hợp lệ: %s\n" -+msgstr "%s: mục tin không hợp lệ: %s\n" - --#, fuzzy, c-format --#| msgid "%s: %s is an invalid shell.\n" -+#, c-format - msgid "%s: %s is an invalid shell\n" --msgstr "%s: %s là một trình bao không hợp lệ.\n" -+msgstr "%s: %s không phải là hệ vỏ hợp lệ\n" - --#, fuzzy, c-format --#| msgid "%s: user '%s' does not exist\n" -+#, c-format - msgid "%s: Warning: %s does not exist\n" --msgstr "%s: người dùng « %s » không tồn tại\n" -+msgstr "%s: Cảnh báo: %s không tồn tại\n" - --#, fuzzy, c-format --#| msgid "%s: warning: %s not owned by %s\n" -+#, c-format - msgid "%s: Warning: %s is not executable\n" --msgstr "%s: cảnh báo : %s không phải được %s sở hữu\n" -+msgstr "%s: Cảnh báo: %s không có quyền thực thi\n" - - msgid " -c, --check check the user's password expiration\n" - msgstr "" -+" -c, --check kiểm tra sự hết hạn của mật khẩu người dùng\n" - - msgid "" - " -f, --force force password change if the user's " - "password\n" - " is expired\n" - msgstr "" -+" -f, --force ép buộc đổi mật khẩu nếu mật khẩu của người\n" -+" dùng hết hạn\n" - - #, c-format - msgid "%s: options %s and %s conflict\n" -@@ -913,20 +896,20 @@ - "đếm\n" - " lần không đăng nhập được và các giới hạn như " - "thế\n" --" (nếu dùng với cờ « -r », « -m » hay « -l » " --"riêng từng cái)\n" -+" (nếu dùng với cờ “-r”, “-m” hay “-l” riêng " -+"từng cái)\n" - " chỉ cho mỗi tên đăng nhập đưa ra\n" - - #, c-format - msgid "%s: Failed to get the entry for UID %lu\n" --msgstr "%s: Không lấy được mục nhập cho UID %lu\n" -+msgstr "%s: Không lấy được mục tin cho UID %lu\n" - - msgid "Login Failures Maximum Latest On\n" --msgstr "Đăng nhập\t\tBị lỗi\tTối đa\tMới nhất Vào\n" -+msgstr "Đăng nhập Bị lỗi Tối đa Mới nhất Vào\n" - - #, c-format - msgid " [%lus left]" --msgstr " [%lus còn lại]" -+msgstr " [còn %lus]" - - #, c-format - msgid " [%lds lock]" -@@ -934,11 +917,11 @@ - - #, c-format - msgid "%s: Failed to reset fail count for UID %lu\n" --msgstr "%s: không đặt lại được hàm đếm cho UID %lu\n" -+msgstr "%s: Gặp lỗi khi đặt lại số đếm cho UID %lu\n" - - #, c-format - msgid "%s: Failed to set max for UID %lu\n" --msgstr "%s: không đặt được số tối đa cho UID %lu\n" -+msgstr "%s: Gặp lỗi khi đặt số tối đa cho UID %lu\n" - - #, c-format - msgid "%s: Failed to set locktime for UID %lu\n" -@@ -952,10 +935,9 @@ - msgid "%s: Cannot get the size of %s: %s\n" - msgstr "%s: Không thể lấy kích cỡ của %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: failed to remove %s\n" -+#, c-format - msgid "%s: Failed to write %s: %s\n" --msgstr "%s: không gỡ bỏ được %s\n" -+msgstr "%s: Gặp lỗi khi ghi %s: %s\n" - - #, c-format - msgid "" -@@ -963,7 +945,7 @@ - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn] NHÓM\n" -+"Cách dùng: %s [tuỳ_chọn] NHÓM\n" - "\n" - "Tuỳ chọn:\n" - -@@ -974,7 +956,7 @@ - msgstr " -d, --delete NGƯỜI_DÙNG gỡ bỏ người dùng này khỏi NHÓM\n" - - msgid " -Q, --root CHROOT_DIR directory to chroot into\n" --msgstr "" -+msgstr " -Q, --root THƯ_MỤC_ĐỔI thư mục gốc sẽ chuyển đến\n" - - msgid " -r, --remove-password remove the GROUP's password\n" - msgstr " -r, --remove-password gỡ bỏ mật khẩu của NHÓM\n" -@@ -997,18 +979,18 @@ - " đặt danh sách các quản trị cho NHÓM\n" - - msgid "Except for the -A and -M options, the options cannot be combined.\n" --msgstr "Trừ hai tuỳ chọn « -A » và « -M », không thể tổ hợp các tuỳ chọn.\n" -+msgstr "Trừ hai tuỳ chọn “-A” và “-M”, không thể tổ hợp các tuỳ chọn.\n" - - msgid "The options cannot be combined.\n" - msgstr "Không thể tổ hợp các tuỳ chọn.\n" - - #, c-format - msgid "%s: shadow group passwords required for -A\n" --msgstr "%s: mật khẩu nhóm bóng cần thiết cho tùy chọn « -A »\n" -+msgstr "%s: mật khẩu nhóm shadow cần cho tùy chọn “-A”\n" - - #, c-format - msgid "%s: group '%s' does not exist in %s\n" --msgstr "%s: nhóm « %s » không tồn tại trong %s\n" -+msgstr "%s: nhóm “%s” không tồn tại trong %s\n" - - #, c-format - msgid "%s: failure while closing read-only %s\n" -@@ -1025,11 +1007,11 @@ - msgstr "Nhập lại mật khẩu mới: " - - msgid "They don't match; try again" --msgstr "Hai mật khẩu không trùng thì háy thử lại." -+msgstr "Hai mật khẩu không khớp nhau, hãy thử lại" - - #, c-format - msgid "%s: Try again later\n" --msgstr "%s: hãy thử lại sau.\n" -+msgstr "%s: Hãy thử lại sau\n" - - #, c-format - msgid "Adding user %s to group %s\n" -@@ -1041,7 +1023,7 @@ - - #, c-format - msgid "%s: user '%s' is not a member of '%s'\n" --msgstr "%s: người dùng « %s » không thuộc về « %s »\n" -+msgstr "%s: người dùng “%s” không thuộc về “%s”\n" - - #, c-format - msgid "%s: Not a tty\n" -@@ -1053,7 +1035,7 @@ - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...] NHÓM\n" -+"Cách dùng: %s [tuỳ_chọn ...] NHÓM\n" - "\n" - "Tuỳ chọn:\n" - -@@ -1062,16 +1044,16 @@ - "exists,\n" - " and cancel -g if the GID is already used\n" - msgstr "" --" -f, --force thoát thành công nếu nhóm đã có, và hủy bỏ « " --"-g » nếu GID đã được dùng\n" -+" -f, --force thoát thành công nếu nhóm đã có, và \n" -+" hủy bỏ “-g” nếu GID đã được dùng\n" - - msgid " -g, --gid GID use GID for the new group\n" - msgstr " -g, --gid GID dùng GID này cho nhóm mới\n" - - msgid " -K, --key KEY=VALUE override /etc/login.defs defaults\n" - msgstr "" --" -K, --key KHOÁ=GIÁ_TRỊ ghi đè lên các giá trị mặc định « /etc/login." --"defs »\n" -+" -K, --key KHOÁ=GIÁ_TRỊ ghi đè lên các giá trị mặc định “/etc/login." -+"defs”\n" - - msgid "" - " -o, --non-unique allow to create groups with duplicate\n" -@@ -1091,44 +1073,43 @@ - - #, c-format - msgid "%s: '%s' is not a valid group name\n" --msgstr "%s: « %s » không phải là tên nhóm hợp lệ\n" -+msgstr "%s: “%s” không phải là tên nhóm hợp lệ\n" - - #, c-format - msgid "%s: invalid group ID '%s'\n" --msgstr "%s: mã số nhóm (GID) không hợp lệ « %s »\n" -+msgstr "%s: mã số nhóm (GID) không hợp lệ “%s”\n" - - #, c-format - msgid "%s: -K requires KEY=VALUE\n" --msgstr "%s: -K cần thiết cú pháp KHÓA=GIÁ_TRỊ\n" -+msgstr "%s: -K cần cú pháp KHÓA=GIÁ_TRỊ\n" - - #, c-format - msgid "%s: group '%s' already exists\n" --msgstr "%s: nhóm « %s » đã có\n" -+msgstr "%s: nhóm “%s” đã có\n" - - #, c-format - msgid "%s: GID '%lu' already exists\n" --msgstr "%s: GID « %lu » đã có\n" -+msgstr "%s: GID “%lu” đã có\n" - --#, fuzzy, c-format --#| msgid "%s: Cannot determine your user name.\n" -+#, c-format - msgid "%s: Cannot setup cleanup service.\n" --msgstr "%s: không thể quyết định tên người dùng của bạn.\n" -+msgstr "%s: Không thể cài đặt dịch vụ dọn dẹp.\n" - - #, c-format - msgid "%s: cannot remove entry '%s' from %s\n" --msgstr "%s: không thể gỡ bỏ mục nhập « %s » khỏi %s\n" -+msgstr "%s: không thể gỡ bỏ mục tin “%s” khỏi %s\n" - - #, c-format - msgid "%s: cannot remove the primary group of user '%s'\n" --msgstr "%s: không thể gỡ bỏ nhóm chính của người dùng « %s »\n" -+msgstr "%s: không thể gỡ bỏ nhóm chính của người dùng “%s”\n" - - #, c-format - msgid "%s: group '%s' does not exist\n" --msgstr "%s: nhóm « %s » không tồn tại\n" -+msgstr "%s: nhóm “%s” không tồn tại\n" - - #, c-format - msgid "%s: group '%s' is a NIS group\n" --msgstr "%s: nhóm « %s » là một nhóm kiểu NIS\n" -+msgstr "%s: nhóm “%s” là một nhóm kiểu NIS\n" - - #, c-format - msgid "%s: %s is the NIS master\n" -@@ -1136,11 +1117,11 @@ - - #, c-format - msgid "%s: user '%s' is already a member of '%s'\n" --msgstr "%s: người dùng « %s » đã thuộc về « %s »\n" -+msgstr "%s: người dùng “%s” đã thuộc về “%s”\n" - - #, c-format - msgid "%s: Out of memory. Cannot update %s.\n" --msgstr "%s: Không đủ bộ nhớ. Không thể cập nhật %s.\n" -+msgstr "%s: Hết bộ nhớ. Không thể cập nhật %s.\n" - - #, c-format - msgid "" -@@ -1148,7 +1129,7 @@ - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...] [hành_vi]\n" -+"Cách dùng: %s [tuỳ_chọn ...] [hành_vi]\n" - "\n" - "Tuỳ chọn:\n" - -@@ -1157,14 +1138,14 @@ - "group\n" - " (root only)\n" - msgstr "" --" -g, --group TÊN_NHÓM thay đổi tên của nhóm này thay cho nhóm của " --"người dùng (chỉ người chủ)\n" -+" -g, --group TÊN_NHÓM thay đổi tên của nhóm này thay cho nhóm của\n" -+" người dùng (chỉ siêu quản trị)\n" - - msgid "\n" - msgstr "\n" - - msgid "Actions:\n" --msgstr "Hành vi:\n" -+msgstr "Hành động là:\n" - - msgid "" - " -a, --add username add username to the members of the group\n" -@@ -1187,7 +1168,7 @@ - - #, c-format - msgid "%s: only root can use the -g/--group option\n" --msgstr "%s: chỉ người chủ có quyền sử dụng tuỳ chọn « -g/--group »\n" -+msgstr "%s: chỉ siêu quản trị có quyền sử dụng tuỳ chọn “-g/--group”\n" - - msgid " -g, --gid GID change the group ID to GID\n" - msgstr " -g, --gid GID thay đổi mã số nhóm sang GID này\n" -@@ -1210,7 +1191,7 @@ - - #, c-format - msgid "%s: invalid group name '%s'\n" --msgstr "%s: tên nhóm không hợp lệ « %s »\n" -+msgstr "%s: tên nhóm không hợp lệ “%s”\n" - - #, c-format - msgid "%s: group %s is a NIS group\n" -@@ -1220,70 +1201,57 @@ - msgid "%s: unknown user %s\n" - msgstr "%s: không rõ người dùng %s\n" - --#, fuzzy, c-format --#| msgid "" --#| "Usage: %s [options]\n" --#| "\n" --#| "Options:\n" -+#, c-format - msgid "" - "Usage: %s [options] [group [gshadow]]\n" - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [các_tuỳ_chọn] [group [gshadow]]\n" - "\n" - "Tuỳ chọn:\n" - --#, fuzzy, c-format --#| msgid "" --#| "Usage: %s [options]\n" --#| "\n" --#| "Options:\n" -+#, c-format - msgid "" - "Usage: %s [options] [group]\n" - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [các_tuỳ_chọn] [group]\n" - "\n" - "Tuỳ chọn:\n" - --#, fuzzy --#| msgid "" --#| " -s, --sha-rounds number of SHA rounds for the SHA*\n" --#| " crypt algorithms\n" - msgid "" - " -r, --read-only display errors and warnings\n" - " but do not change files\n" - msgstr "" --" -s, --sha-rounds số vòng SHA cho thuật toán mã hoá SHA*\n" -+" -r, --read-only hiển thị lỗi và cảnh báo\n" -+" nhưng không thay đổi các tập tin\n" - --#, fuzzy --#| msgid " -g, --gid GID use GID for the new group\n" - msgid " -s, --sort sort entries by UID\n" --msgstr " -g, --gid GID dùng GID này cho nhóm mới\n" -+msgstr " -s, --sort sắp xếp các mục tin theo UID\n" - - #, c-format - msgid "%s: -s and -r are incompatible\n" --msgstr "%s: hai tùy chọn « -s » và « -r » không tương thích với nhau\n" -+msgstr "%s: hai tùy chọn “-s” và “-r” không tương thích với nhau\n" - - msgid "invalid group file entry" --msgstr "mục nhập tập tin nhóm không hợp lệ" -+msgstr "mục tin tập tin nhóm không hợp lệ" - - #, c-format - msgid "delete line '%s'? " --msgstr "xóa dòng « %s » không? " -+msgstr "xóa dòng “%s” không? " - - msgid "duplicate group entry" --msgstr "mục nhập nhóm trùng" -+msgstr "mục tin nhóm trùng" - - #, c-format - msgid "invalid group name '%s'\n" --msgstr "tên nhóm không hợp lệ « %s »\n" -+msgstr "tên nhóm không hợp lệ “%s”\n" - - #, c-format - msgid "invalid group ID '%lu'\n" --msgstr "mã số nhóm không hợp lệ « %lu »\n" -+msgstr "mã số nhóm không hợp lệ “%lu”\n" - - #, c-format - msgid "group %s: no user %s\n" -@@ -1291,40 +1259,40 @@ - - #, c-format - msgid "delete member '%s'? " --msgstr "xóa thành viên « %s » không? " -+msgstr "xóa thành viên “%s” không? " - - #, c-format - msgid "no matching group file entry in %s\n" --msgstr "không có mục nhập tập tin nhóm tương ứng trong %s\n" -+msgstr "không có mục tin tập tin nhóm tương ứng trong %s\n" - - #, c-format - msgid "add group '%s' in %s? " --msgstr "thêm nhóm « %s » trong %s không?" -+msgstr "thêm nhóm “%s” trong %s không?" - - #, c-format - msgid "" - "group %s has an entry in %s, but its password field in %s is not set to 'x'\n" - msgstr "" --"nhóm %s có một mục nhập trong %s, còn trường mật khẩu trong %s không phải " --"được đặt thành « x »\n" -+"nhóm %s có một mục tin trong %s, còn trường mật khẩu trong %s không phải " -+"được đặt thành “x”\n" - - msgid "invalid shadow group file entry" --msgstr "mục nhập tập tin nhóm bóng không hợp lệ" -+msgstr "mục tin tập tin nhóm shadow không hợp lệ" - - msgid "duplicate shadow group entry" --msgstr "mục nhập nhóm bóng trùng" -+msgstr "mục tin nhóm shadow trùng" - - #, c-format - msgid "shadow group %s: no administrative user %s\n" --msgstr "nhóm bóng %s: không có người dùng quản trị %s\n" -+msgstr "nhóm shadow %s: không có người dùng quản trị %s\n" - - #, c-format - msgid "delete administrative member '%s'? " --msgstr "xóa thành viên quản trị « %s » không? " -+msgstr "xóa thành viên quản trị “%s” không? " - - #, c-format - msgid "shadow group %s: no user %s\n" --msgstr "nhóm bóng %s: không có người dùng %s\n" -+msgstr "nhóm shadow %s: không có người dùng %s\n" - - #, c-format - msgid "%s: the files have been updated\n" -@@ -1339,10 +1307,10 @@ - msgstr "%s: không thể xoá %s\n" - - msgid "Usage: id [-a]\n" --msgstr "Sử dụng: id [-a]\n" -+msgstr "Cách dùng: id [-a]\n" - - msgid "Usage: id\n" --msgstr "Sử dụng: id\n" -+msgstr "Cách dùng: id\n" - - msgid " groups=" - msgstr " nhóm=" -@@ -1350,7 +1318,8 @@ - msgid "" - " -b, --before DAYS print only lastlog records older than DAYS\n" - msgstr "" --" -b, --before SỐ hiển thị chỉ những bản ghi lastlog\n" -+" -b, --before SỐ hiển thị chỉ những bản ghi lastlog cũ hơn SỐ " -+"ngày\n" - " cũ hơn số ngày này (_trước_)\n" - - msgid "" -@@ -1358,7 +1327,7 @@ - "DAYS\n" - msgstr "" - " -t, --time SỐ hiển thị chỉ những mục ghi lastlog\n" --" mới hơn số ngày này (_thời gian_)\n" -+" mới hơn số ngày này (_thời gian_)\n" - - msgid "" - " -u, --user LOGIN print lastlog record of the specified LOGIN\n" -@@ -1367,17 +1336,17 @@ - "tên này\n" - - msgid "Username Port From Latest" --msgstr "Tên dùng\t\t Cổng Từ\t\tMới nhất" -+msgstr "Tài_khoản Cổng Từ Mới nhất" - - msgid "Username Port Latest" --msgstr "Tên dùng\t\t\t Cổng Mới nhất" -+msgstr "Người dùng Cổng Mới nhất" - - msgid "**Never logged in**" - msgstr "**Chưa bao giờ đăng nhập**" - - #, c-format - msgid "Usage: %s [-p] [name]\n" --msgstr "Sử dụng: %s [-p] [tên]\n" -+msgstr "Cách dùng: %s [-p] [tên]\n" - - #, c-format - msgid " %s [-p] [-h host] [-f name]\n" -@@ -1389,7 +1358,7 @@ - - #, c-format - msgid "configuration error - cannot parse %s value: '%d'" --msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: « %d »" -+msgstr "lỗi cấu hình — không thể phân tích cú pháp của giá trị %s: “%d”" - - msgid "Invalid login time" - msgstr "Thời gian đăng nhập không hợp lệ" -@@ -1406,7 +1375,7 @@ - "[Disconnect bypassed -- root login allowed.]" - msgstr "" - "\n" --"[Chức năng ngắt kết nối đã bị vòng: cho phép người chủ đăng nhập.]" -+"[Chức năng ngắt kết nối đã bị vòng: cho phép siêu quản trị đăng nhập.]" - - #, c-format - msgid "" -@@ -1422,12 +1391,12 @@ - - msgid "No utmp entry. You must exec \"login\" from the lowest level \"sh\"" - msgstr "" --"Không có mục nhập utmp. Vì thế bạn cần phải thực hiện « login » (đăng nhập) " --"từ « sh » (trình bao) cấp dưới cùng." -+"Không có mục tin utmp. Vì thế bạn cần phải thực hiện “login” (đăng nhập) từ " -+"“sh” (hệ vỏ) cấp dưới cùng." - - #, c-format - msgid "login: PAM Failure, aborting: %s\n" --msgstr "login: (đăng nhập) PAM bị lỗi nên hủy bỏ : %s\n" -+msgstr "login: (đăng nhập) PAM bị lỗi nên hủy bỏ: %s\n" - - #, c-format - msgid "%s login: " -@@ -1446,10 +1415,9 @@ - msgid "Login incorrect" - msgstr "Đăng nhập không đúng" - --#, fuzzy, c-format --#| msgid "%s: Cannot determine your user name.\n" -+#, c-format - msgid "Cannot find user (%s)\n" --msgstr "%s: không thể quyết định tên người dùng của bạn.\n" -+msgstr "Không thể tìm thấy người dùng (%s)\n" - - #, c-format - msgid "" -@@ -1468,7 +1436,7 @@ - msgstr "TIOCSCTTY bị lỗi vào %s" - - msgid "Warning: login re-enabled after temporary lockout." --msgstr "Cảnh báo : đăng nhập đã bật lại sau bị khoá ra tạm thời." -+msgstr "Cảnh báo: đăng nhập đã bật lại sau bị khoá ra tạm thời." - - #, c-format - msgid "Last login: %s on %s" -@@ -1490,16 +1458,16 @@ - "\n" - - msgid "Usage: logoutd\n" --msgstr "Usage: logoutd\n" -+msgstr "Cách dùng: logoutd\n" - - msgid "Usage: newgrp [-] [group]\n" - msgstr "" --"Sử dụng: newgrp [-] [nhóm]\n" -+"Cách dùng: newgrp [-] [nhóm]\n" - "[newgrp: nhóm mới]\n" - - msgid "Usage: sg group [[-c] command]\n" - msgstr "" --"Sử dụng: sg group [[-c] lệnh]\n" -+"Cách dùng: sg group [[-c] lệnh]\n" - "[group: nhóm]\n" - - msgid "Invalid password.\n" -@@ -1511,7 +1479,7 @@ - - #, c-format - msgid "%s: GID '%lu' does not exist\n" --msgstr "%s: GID « %lu » không tồn tại\n" -+msgstr "%s: GID “%lu” không tồn tại\n" - - msgid "too many groups\n" - msgstr "quá nhiều nhóm\n" -@@ -1522,15 +1490,15 @@ - #, c-format - msgid "%s: group '%s' is a shadow group, but does not exist in /etc/group\n" - msgstr "" --"%s: nhóm « %s » là một nhóm bóng, nhưng không tồn tại trong « /etc/group »\n" -+"%s: nhóm “%s” là một nhóm shadow, nhưng không tồn tại trong “/etc/group”\n" - - #, c-format - msgid "%s: invalid user ID '%s'\n" --msgstr "%s: mã số người dùng không hợp lệ « %s »\n" -+msgstr "%s: mã số người dùng không hợp lệ “%s”\n" - - #, c-format - msgid "%s: invalid user name '%s'\n" --msgstr "%s: tên dùng không hợp lệ « %s »\n" -+msgstr "%s: tên dùng không hợp lệ “%s”\n" - - #, c-format - msgid "%s: line %d: invalid line\n" -@@ -1539,7 +1507,7 @@ - #, c-format - msgid "%s: cannot update the entry of user %s (not in the passwd database)\n" - msgstr "" --"%s: không thể cập nhật mục nhập của người dùng %s (không có trong cơ sở dữ " -+"%s: không thể cập nhật mục tin của người dùng %s (không có trong cơ sở dữ " - "liệu mật khẩu passwd)\n" - - #, c-format -@@ -1552,7 +1520,7 @@ - - #, c-format - msgid "%s: line %d: user '%s' does not exist in %s\n" --msgstr "%s: dòng %d: người dùng « %s » không tồn tại trong %s\n" -+msgstr "%s: dòng %d: người dùng “%s” không tồn tại trong %s\n" - - #, c-format - msgid "%s: line %d: can't update password\n" -@@ -1568,7 +1536,7 @@ - - #, c-format - msgid "%s: line %d: can't update entry\n" --msgstr "%s: dòng %d: không thể cập nhật mục nhập\n" -+msgstr "%s: dòng %d: không thể cập nhật mục tin\n" - - msgid "" - " -a, --all report password status on all accounts\n" -@@ -1642,7 +1610,7 @@ - "khi thay đổi được mật khẩu\n" - - msgid "Old password: " --msgstr "Mật khẩu cũ : " -+msgstr "Mật khẩu cũ: " - - #, c-format - msgid "" -@@ -1671,7 +1639,7 @@ - "Warning: weak password (enter it again to use it anyway)." - msgstr "" - "\n" --"Cảnh báo : mật khẩu yếu (nhập lại để vẫn chọn)" -+"Cảnh báo: mật khẩu yếu (nhập lại để vẫn chọn)" - - msgid "They don't match; try again.\n" - msgstr "Hai mật khẩu không trùng: hãy thử lại.\n" -@@ -1691,8 +1659,8 @@ - "account.\n" - msgstr "" - "%s: mở khoá mật khẩu thì gây ra một tài khoản không có mật khẩu.\n" --"Bạn nên đặt một mật khẩu dùng câu lệnh « usermod -p » để mở khoá mật khẩu " --"của tài khoản này.\n" -+"Bạn nên đặt một mật khẩu dùng câu lệnh “usermod -p” để mở khoá mật khẩu của " -+"tài khoản này.\n" - - #, c-format - msgid "%s: repository %s not supported\n" -@@ -1723,109 +1691,96 @@ - msgid "%s: password expiry information changed.\n" - msgstr "%s: thông tin đã thay đổi về sự hết hạn sử dụng mật khẩu.\n" - --#, fuzzy, c-format --#| msgid "" --#| "Usage: %s [options]\n" --#| "\n" --#| "Options:\n" -+#, c-format - msgid "" - "Usage: %s [options] [passwd]\n" - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [các_tuỳ_chọn] [passwd]\n" - "\n" - "Tuỳ chọn:\n" - --#, fuzzy, c-format --#| msgid "" --#| "Usage: %s [options]\n" --#| "\n" --#| "Options:\n" -+#, c-format - msgid "" - "Usage: %s [options] [passwd [shadow]]\n" - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [các_tuỳ_chọn] [passwd [shadow]]\n" - "\n" - "Tuỳ chọn:\n" - --#, fuzzy --#| msgid " -g, --gid GID use GID for the new group\n" - msgid " -q, --quiet report errors only\n" --msgstr " -g, --gid GID dùng GID này cho nhóm mới\n" -+msgstr " -q, --quiet chỉ báo cáo lỗi\n" - - #, c-format - msgid "%s: no alternative shadow file allowed when USE_TCB is enabled.\n" - msgstr "" -+"%s: không cho phép tập tin shadow thay thế khi mà biến USE_TCB được đặt.\n" - - msgid "invalid password file entry" --msgstr "Mục nhập tập tin mật khẩu không hợp lệ" -+msgstr "mục tin tập tin mật khẩu không hợp lệ" - - msgid "duplicate password entry" --msgstr "mục nhập mật khẩu trùng" -+msgstr "mục tin mật khẩu trùng" - - #, c-format - msgid "invalid user name '%s'\n" --msgstr "tên người dùng không hợp lệ « %s »\n" -+msgstr "tên người dùng không hợp lệ “%s”\n" - - #, c-format - msgid "invalid user ID '%lu'\n" --msgstr "mã số người dùng không hợp lệ « %lu »\n" -+msgstr "mã số người dùng không hợp lệ “%lu”\n" - - #, c-format - msgid "user '%s': no group %lu\n" --msgstr "người dùng « %s »: không có nhóm %lu\n" -+msgstr "người dùng “%s”: không có nhóm %lu\n" - - #, c-format - msgid "user '%s': directory '%s' does not exist\n" --msgstr "người dùng « %s »: thư mục « %s » không tồn tại\n" -+msgstr "người dùng “%s”: thư mục “%s” không tồn tại\n" - - #, c-format - msgid "user '%s': program '%s' does not exist\n" --msgstr "người dùng « %s »: chương trình « %s » không tồn tại\n" -+msgstr "người dùng “%s”: chương trình “%s” không tồn tại\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "no tcb directory for %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "không có thư mục tcb cho %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "create tcb directory for %s?" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "tạo thư mục tcb %s không?" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "failed to create tcb directory for %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "gặp lỗi khi tạo thư mục tcb cho %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot open %s\n" -+#, c-format - msgid "%s: cannot lock %s.\n" --msgstr "%s: không thể mở %s\n" -+msgstr "%s: không thể khóa %s.\n" - - #, c-format - msgid "no matching password file entry in %s\n" --msgstr "không có mục nhập tập tin mật khẩu tương ứng trong %s\n" -+msgstr "không có mục tin tập tin mật khẩu tương ứng trong %s\n" - - #, c-format - msgid "add user '%s' in %s? " --msgstr "thêm người dùng « %s » trong %s không?" -+msgstr "thêm người dùng “%s” trong %s không?" - - #, c-format - msgid "" - "user %s has an entry in %s, but its password field in %s is not set to 'x'\n" - msgstr "" --"người dùng %s có một mục nhập trong %s, còn trường mật khẩu trong %s không " --"phải được đặt thành « s »\n" -+"người dùng %s có một mục tin trong %s, còn trường mật khẩu trong %s không " -+"phải được đặt thành “s”\n" - - msgid "invalid shadow password file entry" --msgstr "mục nhập tập tin mật khẩu bóng không hợp lệ" -+msgstr "mục tin tập tin mật khẩu shadow không hợp lệ" - - msgid "duplicate shadow password entry" --msgstr "mục nhập mật khẩu bóng trùng" -+msgstr "mục tin mật khẩu shadow trùng" - - #, c-format - msgid "user %s: last password change in the future\n" -@@ -1833,18 +1788,18 @@ - - #, c-format - msgid "%s: cannot sort entries in %s\n" --msgstr "%s: không thể sắp xếp các mục nhập trong %s\n" -+msgstr "%s: không thể sắp xếp các mục tin trong %s\n" - - #, c-format - msgid "%s: can't work with tcb enabled\n" --msgstr "" -+msgstr "%s: không thể làm việc khi tcb được bật\n" - - #, c-format - msgid "%s: failed to change the mode of %s to 0600\n" - msgstr "%s: không thay đổi được chế độ của %s thành 0600\n" - - msgid "Access to su to that account DENIED.\n" --msgstr "Truy cập « su » vào tài khoản đó BỊ TỪ CHỐI.\n" -+msgstr "Truy cập “su” vào tài khoản đó BỊ TỪ CHỐI.\n" - - msgid "Password authentication bypassed.\n" - msgstr "Xác thực mật khẩu bị đi vòng.\n" -@@ -1853,33 +1808,32 @@ - msgstr "Hãy nhập mật khẩu của MÌNH để xác thực.\n" - - msgid " ...killed.\n" --msgstr "" -+msgstr " ...đã chết.\n" - - msgid " ...waiting for child to terminate.\n" --msgstr "" -+msgstr " ...đang đợi tiến con chấm dứt.\n" - --#, fuzzy, c-format --#| msgid "%s: Cannot determine your user name.\n" -+#, c-format - msgid "%s: Cannot fork user shell\n" --msgstr "%s: không thể quyết định tên người dùng của bạn.\n" -+msgstr "%s: Không thể rẽ nhánh tiến trình hệ vỏ người dùng\n" - - #, c-format - msgid "%s: signal malfunction\n" --msgstr "" -+msgstr "%s: tín hiệu trục trặc\n" - - #, c-format - msgid "%s: signal masking malfunction\n" --msgstr "" -+msgstr "%s: trục trặc mặt nạ tín hiệu\n" - - msgid "Session terminated, terminating shell..." --msgstr "" -+msgstr "Phiên làm việc đã kết thúc, nên kết thúc hệ vỏ..." - - #, c-format - msgid "%s: %s\n" - msgstr "%s: %s\n" - - msgid " ...terminated.\n" --msgstr "" -+msgstr " ...đã chấm dứt.\n" - - msgid "" - "Usage: su [options] [LOGIN]\n" -@@ -1894,20 +1848,20 @@ - " -s, --shell SHELL use SHELL instead of the default in passwd\n" - "\n" - msgstr "" --"Sử dụng: su [tùy_chọn...] [đăng_nhập]\n" -+"Cách dùng: su [tùy_chọn...] [đăng_nhập]\n" - "\n" - "[su: siêu người dùng]\n" - "\n" - "Tùy chọn:\n" --" -c, --command LỆNH gởi lệnh này qua cho trình bao đã gọi\n" -+" -c, --command LỆNH gởi lệnh này qua cho hệ vỏ đã gọi\n" - " -h, --help hiển thị _trợ giúp_ này rồi thoát\n" --" -, -l, --login lập trình bao là trình bao _đăng nhập_\n" -+" -, -l, --login lập hệ vỏ là hệ vỏ _đăng nhập_\n" - " -m, -p,\n" --" --preserve-environment đừng lập lại các biến _môi trường_, và " -+" --preserve-environment đừng đặt lại các biến _môi trường_, và " - "_giữ_\n" --" trình bao hiện có\n" --" -s, --shell TRÌNH_BAO sử dụng trình bao này thay cho trình mặc " --"định trong passwd\n" -+" hệ vỏ hiện có\n" -+" -s, --shell HỆ_VỎ dùng hệ vỏ này thay cho trình mặc định trong " -+"passwd\n" - "\n" - - #, c-format -@@ -1916,11 +1870,11 @@ - "(Ignored)\n" - msgstr "" - "%s: %s\n" --"(Bị bo qua)\n" -+"(Bị bỏ qua)\n" - - #, c-format - msgid "You are not authorized to su %s\n" --msgstr "Bạn không có quyền sử dụng lệnh « su » (siêu người dùng) với %s.\n" -+msgstr "Bạn không có quyền sử dụng lệnh “su” (siêu người dùng) với %s.\n" - - msgid "(Enter your own password)" - msgstr "(Nhập mật khẩu của mình)" -@@ -1932,12 +1886,11 @@ - #, c-format - msgid "%s: You are not authorized to su at that time\n" - msgstr "" --"%s: Bạn không có quyền sử dụng lệnh « su » (siêu người dùng) vào lúc đó\n" -+"%s: Bạn không có quyền sử dụng lệnh “su” (siêu người dùng) vào lúc đó\n" - --#, fuzzy, c-format --#| msgid "No password entry for 'root'" -+#, c-format - msgid "No passwd entry for user '%s'\n" --msgstr "Không có mục nhập mật khẩu cho « root » (người chủ)" -+msgstr "Không có mục tin mật khẩu cho tài khoản '%s'\n" - - #, c-format - msgid "%s: must be run from a terminal\n" -@@ -1947,15 +1900,13 @@ - msgid "%s: pam_start: error %d\n" - msgstr "%s: pam_start: (pam bắt đầu) lỗi %d\n" - --#, fuzzy, c-format --#| msgid "lastlog: Cannot get the size of %s: %s\n" -+#, c-format - msgid "%s: Cannot drop the controlling terminal\n" --msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n" -+msgstr "%s: Không thể xóa thiết bị cuối điều khiển\n" - --#, fuzzy, c-format --#| msgid "Cannot execute %s" -+#, c-format - msgid "Cannot execute %s\n" --msgstr "Không thể thực hiện %s" -+msgstr "Không thể thực thi %s\n" - - msgid "No password file" - msgstr "Không có tập tin mật khẩu" -@@ -1964,7 +1915,7 @@ - msgstr "TIOCSCTTY bị lỗi" - - msgid "No password entry for 'root'" --msgstr "Không có mục nhập mật khẩu cho « root » (người chủ)" -+msgstr "Không có mục tin mật khẩu cho “root” (siêu quản trị)" - - msgid "" - "\n" -@@ -1973,14 +1924,14 @@ - msgstr "" - "\n" - "Hãy gõ tổ hợp phím Ctrl-D để tiếp tục khởi động bình thường,\n" --"(hoặc nhập mật khẩu người chủ để bảo dưỡng hệ thống):" -+"(hoặc nhập mật khẩu siêu quản trị để bảo dưỡng hệ thống):" - - msgid "Entering System Maintenance Mode" - msgstr "Đang vào Chế độ Bảo dưỡng Hệ thống" - - #, c-format - msgid "%s: %s was created, but could not be removed\n" --msgstr "" -+msgstr "%s: %s đã được tạo, nhưng không thể bị gỡ bỏ\n" - - #, c-format - msgid "%s: the %s configuration in %s will be ignored\n" -@@ -1998,10 +1949,9 @@ - msgid "%s: line too long in %s: %s..." - msgstr "%s: dòng quá dài trong %s: %s..." - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: Cannot create backup file (%s): %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: Không thể tạo tập tin sao lưu dự phòng (%s): %s\n" - - #, c-format - msgid "%s: rename: %s: %s\n" -@@ -2009,17 +1959,13 @@ - - #, c-format - msgid "%s: group '%s' is a NIS group.\n" --msgstr "%s: nhóm « %s » là nhóm kiểu NIS.\n" -+msgstr "%s: nhóm “%s” là nhóm kiểu NIS.\n" - - #, c-format - msgid "%s: too many groups specified (max %d).\n" - msgstr "%s: ghi rõ quá nhiều nhóm (tối đa %d).\n" - --#, fuzzy, c-format --#| msgid "" --#| "Usage: %s [options]\n" --#| "\n" --#| "Options:\n" -+#, c-format - msgid "" - "Usage: %s [options] LOGIN\n" - " %s -D\n" -@@ -2027,7 +1973,9 @@ - "\n" - "Options:\n" - msgstr "" --"Sử dụng: %s [tuỳ_chọn ...]\n" -+"Cách dùng: %s [các_tuỳ_chọn] LOGIN\n" -+" %s -D\n" -+" %s -D [các-tùy-chọn]\n" - "\n" - "Tuỳ chọn:\n" - -@@ -2036,63 +1984,62 @@ - "the\n" - " new account\n" - msgstr "" --" -b, --base-dir THƯ_MỤC đặt thư mục cơ bản cho thư mục chính của tài " -+" -b, --base-dir THƯ_MỤC đặt thư mục cơ bản cho thư mục riêng của tài " - "khoản mới\n" - - msgid " -c, --comment COMMENT GECOS field of the new account\n" - msgstr " -c, --comment GHI_CHÚ trường GECOS của tài khoản mới\n" - - msgid " -d, --home-dir HOME_DIR home directory of the new account\n" --msgstr " -d, --home-dir THƯ_MỤC thư mục chính của tài khoản mới\n" -+msgstr " -d, --home-dir THƯ_MỤC thư mục riêng của tài khoản mới\n" - - msgid "" - " -D, --defaults print or change default useradd " - "configuration\n" - msgstr "" --" -D, --defaults ra ra hay thay đổi cấu hình useradd mặc " --"định\n" -+" -D, --defaults in hay thay đổi cấu hình useradd mặc định\n" - - msgid " -e, --expiredate EXPIRE_DATE expiration date of the new account\n" --msgstr " -e, --expiredate NGÀY ngày hết hạn sử dụng tài khoản mới\n" -+msgstr " -e, --expiredate NGÀY ngày hết hạn sử dụng tài khoản mới\n" - - msgid "" - " -f, --inactive INACTIVE password inactivity period of the new " - "account\n" - msgstr "" --" -f, --inactive KHOẢNG khoảng thời gian không hoạt động của tài khoản " --"mới\n" -+" -f, --inactive KHOẢNG khoảng thời gian không hoạt động của tài " -+"khoản mới\n" - - msgid "" - " -g, --gid GROUP name or ID of the primary group of the new\n" - " account\n" - msgstr "" --" -g, --gid NHÓM tên của mã số của nhóm chính của tài khoản " -+" -g, --gid NHÓM tên của mã số của nhóm chính của tài khoản " - "mới\n" - - msgid "" - " -G, --groups GROUPS list of supplementary groups of the new\n" - " account\n" - msgstr "" --" -G, --groups NHÓM danh sách các nhóm phụ của tài khoản mới\n" -+" -G, --groups NHÓM danh sách các nhóm phụ của tài khoản mới\n" - - msgid "" - " -k, --skel SKEL_DIR use this alternative skeleton directory\n" --msgstr " -k, --skel THƯ_MỤC dùng thư mục khung sườn xen kẽ\n" -+msgstr " -k, --skel THƯ_MỤC dùng thư mục khung sườn thay thế\n" - - msgid "" - " -l, --no-log-init do not add the user to the lastlog and\n" - " faillog databases\n" - msgstr "" --" -l, --no-log-init đừng thêm người dùng vào các cơ sở dữ liệu " --"faillog và lastlog\n" -+" -l, --no-log-init đừng thêm người dùng vào các cơ sở \n" -+" dữ liệu faillog và lastlog\n" - - msgid " -m, --create-home create the user's home directory\n" --msgstr " -m, --create-home tạo thư mục chính của người dùng\n" -+msgstr " -m, --create-home tạo thư mục riêng của người dùng\n" - - msgid "" - " -M, --no-create-home do not create the user's home directory\n" - msgstr "" --" -M, --no-create-home đừng tạo thư mục chính của người dùng\n" -+" -M, --no-create-home không tạo thư mục riêng của người dùng\n" - - msgid "" - " -N, --no-user-group do not create a group with the same name as\n" -@@ -2104,16 +2051,15 @@ - " -o, --non-unique allow to create users with duplicate\n" - " (non-unique) UID\n" - msgstr "" --" -o, --non-unique cho phép tạo người dùng có UID trùng (không " --"duy nhất)\n" -+" -o, --non-unique cho phép tạo người dùng có UID trùng\n" -+" (không duy nhất)\n" - - msgid " -p, --password PASSWORD encrypted password of the new account\n" - msgstr "" - " -p, --password MẬT_KHẨU mật khẩu được mật mã của tài khoản mới\n" - - msgid " -s, --shell SHELL login shell of the new account\n" --msgstr "" --" -s, --shell TRÌNH_BAO trình bao đăng nhập của tài khoản mới\n" -+msgstr " -s, --shell HỆ_VỎ hệ vỏ đăng nhập của tài khoản mới\n" - - msgid " -u, --uid UID user ID of the new account\n" - msgstr " -u, --uid UID mã số người dùng của tài khoản mới\n" -@@ -2127,48 +2073,48 @@ - " -Z, --selinux-user SEUSER use a specific SEUSER for the SELinux user " - "mapping\n" - msgstr "" --" -Z, --selinux-user SEUSER sử dụng một người dùng SE (SEUSER) riêng cho " --"sự ánh xạ người dùng SELinux\n" -+" -Z, --selinux-user SEUSER dùng một người dùng SE (SEUSER) riêng cho sự " -+"ánh xạ người dùng SELinux\n" - - #, c-format - msgid "%s: invalid base directory '%s'\n" --msgstr "%s: thư mục cơ ban không hợp lệ « %s »\n" -+msgstr "%s: thư mục cơ sở không hợp lệ “%s”\n" - - #, c-format - msgid "%s: invalid comment '%s'\n" --msgstr "%s: ghi chú không hợp lệ « %s »\n" -+msgstr "%s: ghi chú không hợp lệ “%s”\n" - - #, c-format - msgid "%s: invalid home directory '%s'\n" --msgstr "%s: thư mục chính không hợp lê « %s »\n" -+msgstr "%s: thư mục riêng không hợp lệ “%s”\n" - - #, c-format - msgid "%s: shadow passwords required for -e\n" --msgstr "%s: cần thiết mật khẩu bóng cho tùy chọn « -e »\n" -+msgstr "%s: cần mật khẩu shadow cho tùy chọn “-e”\n" - - #, c-format - msgid "%s: shadow passwords required for -f\n" --msgstr "%s: cần thiết mật khẩu bóng cho tùy chọn « -f »\n" -+msgstr "%s: cần mật khẩu shadow cho tùy chọn “-f”\n" - - #, c-format - msgid "%s: invalid field '%s'\n" --msgstr "%s: trường không hợp lệ « %s »\n" -+msgstr "%s: trường không hợp lệ “%s”\n" - - #, c-format - msgid "%s: invalid shell '%s'\n" --msgstr "%s: trình bao không hợp lệ « %s »\n" -+msgstr "%s: hệ vỏ không hợp lệ “%s”\n" - - #, c-format - msgid "%s: -Z requires SELinux enabled kernel\n" --msgstr "%s: « -Z » yêu cầu hạt nhân hiệu lực SELinux\n" -+msgstr "%s: “-Z” yêu cầu nhân bật tính năng hỗ trợ SELinux\n" - - #, c-format - msgid "%s: failed to reset the faillog entry of UID %lu: %s\n" --msgstr "%s: không đặt lại được mục nhập faillog của UID %lu: %s\n" -+msgstr "%s: không đặt lại được mục tin faillog của UID %lu: %s\n" - - #, c-format - msgid "%s: failed to reset the lastlog entry of UID %lu: %s\n" --msgstr "%s: không đặt lại được mục nhập lastlog của UID %lu: %s\n" -+msgstr "%s: gặp lỗi khi đặt lại mục tin lastlog của UID %lu: %s\n" - - #, c-format - msgid "%s: cannot create directory %s\n" -@@ -2180,21 +2126,20 @@ - msgid "" - "Group 'mail' not found. Creating the user mailbox file with 0600 mode.\n" - msgstr "" --"Không tìm thấy nhóm « mail » (thư tín). Vì thế đang tạo tập tin hộp thư " --"người dùng với chế độ 0600.\n" -+"Không tìm thấy nhóm “mail” (thư tín). Vì thế đang tạo tập tin hộp thư người " -+"dùng với chế độ 0600.\n" - - msgid "Setting mailbox file permissions" - msgstr "Đang đặt quyền truy cập tập tin hộp thư" - - #, c-format - msgid "%s: user '%s' already exists\n" --msgstr "%s: người dùng « %s » đã có\n" -+msgstr "%s: người dùng “%s” đã có\n" - - #, c-format - msgid "" - "%s: group %s exists - if you want to add this user to that group, use -g.\n" --msgstr "" --"%s: nhóm %s đã có. Muốn thêm họ vào nhóm đó thì dùng tùy chọn « -g ».\n" -+msgstr "%s: nhóm %s đã có. Muốn thêm họ vào nhóm đó thì dùng tùy chọn “-g”.\n" - - #, c-format - msgid "%s: can't create user\n" -@@ -2204,10 +2149,9 @@ - msgid "%s: UID %lu is not unique\n" - msgstr "%s: UID %lu không phải duy nhất\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: Failed to create tcb directory for %s\n" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: Gặp lỗi khi tạo thư mục tcb cho %s\n" - - #, c-format - msgid "%s: can't create group\n" -@@ -2218,59 +2162,55 @@ - "%s: warning: the home directory already exists.\n" - "Not copying any file from skel directory into it.\n" - msgstr "" --"%s: cảnh báo : thư mục chính đã có.\n" --"Vì vậy không sao chép vào nó tập tin nào từ thư mục « skel ».\n" -+"%s: cảnh báo: thư mục riêng đã có.\n" -+"Vì vậy không sao chép vào nó tập tin nào từ thư mục “skel”.\n" - - #, c-format - msgid "%s: warning: the user name %s to %s SELinux user mapping failed.\n" - msgstr "" --"%s: cảnh báo : lỗi ánh xạ tên người dùng %s tới người dùng SELinux %s.\n" -+"%s: cảnh báo: lỗi ánh xạ tên người dùng %s tới người dùng SELinux %s.\n" - - msgid "" - " -f, --force force removal of files,\n" - " even if not owned by user\n" - msgstr "" - " -f, --force ép buộc gỡ bỏ tập tin, thậm chí nếu không\n" --" được sở hữu bởi người dùng\n" -+" được sở hữu bởi người dùng\n" - - msgid " -r, --remove remove home directory and mail spool\n" - msgstr "" --" -r, --remove gỡ bỏ thư mục chính và ống chỉ thư tín\n" -+" -r, --remove gỡ bỏ thư mục riêng và ống chỉ thư tín\n" - --#, fuzzy --#| msgid "" --#| " -Z, --selinux-user new SELinux user mapping for the user " --#| "account\n" - msgid "" - " -Z, --selinux-user remove any SELinux user mapping for the " - "user\n" - msgstr "" --" -Z, --selinux-user sự ánh xạ SELinux mới cho tài khoản người " --"dùng\n" -+" -Z, --selinux-user gỡ bỏ bất kỳ ánh xạ SELinux nào cho tài " -+"khoản người dùng\n" - --#, fuzzy, c-format --#| msgid "%s: cannot remove the primary group of user '%s'\n" -+#, c-format - msgid "" - "%s: group %s not removed because it is not the primary group of user %s.\n" --msgstr "%s: không thể gỡ bỏ nhóm chính của người dùng « %s »\n" -+msgstr "" -+"%s: không gỡ bỏ nhóm %s bởi vì nó không phải là nhóm chính của người dùng " -+"“%s”.\n" - - #, c-format - msgid "%s: group %s not removed because it has other members.\n" --msgstr "" -+msgstr "%s: không thể gỡ bỏ nhóm %s bởi vì nó có thành viên khác nữa.\n" - - #, c-format - msgid "%s: group %s is the primary group of another user and is not removed.\n" - msgstr "" - "%s: nhóm %s là nhóm chính của một người dùng khác thì không bị gỡ bỏ.\n" - --#, fuzzy, c-format --#| msgid "%s: %s home directory (%s) not found\n" -+#, c-format - msgid "%s: %s mail spool (%s) not found\n" --msgstr "%s: %s không tìm thấy thư mục chính (%s)\n" -+msgstr "%s: không tìm thấy bể thư %s (%s)\n" - - #, c-format - msgid "%s: warning: can't remove %s: %s\n" --msgstr "%s: cảnh báo : không thể gỡ bỏ %s: %s\n" -+msgstr "%s: cảnh báo: không thể gỡ bỏ %s: %s\n" - - #, c-format - msgid "%s: %s not owned by %s, not removing\n" -@@ -2278,22 +2218,19 @@ - - #, c-format - msgid "%s: Can't allocate memory, tcb entry for %s not removed.\n" --msgstr "" -+msgstr "%s: Không thể phân bổ bộ nhớ, mục tin tcb cho %s chưa được gỡ bỏ.\n" - --#, fuzzy, c-format --#| msgid "%s: failed to drop privileges (%s)\n" -+#, c-format - msgid "%s: Cannot drop privileges: %s\n" --msgstr "%s: lỗi bỏ quyền truy cập (%s)\n" -+msgstr "%s: Gặp lỗi khi xóa bỏ đặc quyền: %s\n" - --#, fuzzy, c-format --#| msgid "lastlog: Cannot get the size of %s: %s\n" -+#, c-format - msgid "%s: Cannot remove the content of %s: %s\n" --msgstr "lastlog: Không thể lấy kích cỡ của %s: %s\n" -+msgstr "%s: Không thể gỡ bỏ nội dung của %s: %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot remove entry '%s' from %s\n" -+#, c-format - msgid "%s: Cannot remove tcb files for %s: %s\n" --msgstr "%s: không thể gỡ bỏ mục nhập « %s » khỏi %s\n" -+msgstr "%s: Không thể gỡ bỏ tập tin tcb cho %s: %s\n" - - #, c-format - msgid "%s: user %s is a NIS user\n" -@@ -2301,23 +2238,21 @@ - - #, c-format - msgid "%s: %s home directory (%s) not found\n" --msgstr "%s: %s không tìm thấy thư mục chính (%s)\n" -+msgstr "%s: %s không tìm thấy thư mục riêng (%s)\n" - - #, c-format - msgid "%s: not removing directory %s (would remove home of user %s)\n" - msgstr "" --"%s: sẽ không gỡ bỏ thư mục %s (vì cũng gỡ bỏ thư mục chính của người dùng " -+"%s: sẽ không gỡ bỏ thư mục %s (vì cũng gỡ bỏ thư mục riêng của người dùng " - "%s)\n" - - #, c-format - msgid "%s: error removing directory %s\n" - msgstr "%s: gặp lỗi khi gỡ bỏ thư mục %s\n" - --#, fuzzy, c-format --#| msgid "%s: warning: the user name %s to %s SELinux user mapping failed.\n" -+#, c-format - msgid "%s: warning: the user name %s to SELinux user mapping removal failed.\n" --msgstr "" --"%s: cảnh báo : lỗi ánh xạ tên người dùng %s tới người dùng SELinux %s.\n" -+msgstr "%s: cảnh báo: gặp lỗi khi gỡ bỏ ánh xạ người dùng %s tới SELinux.\n" - - msgid " -c, --comment COMMENT new value of the GECOS field\n" - msgstr " -c, --comment GHI_LƯU giá trị mới của trường GECOS\n" -@@ -2325,7 +2260,7 @@ - msgid "" - " -d, --home HOME_DIR new home directory for the user account\n" - msgstr "" --" -d, --home THƯ_MỤC thư mục chính mới cho tài khoản người dùng\n" -+" -d, --home THƯ_MỤC thư mục riêng mới cho tài khoản người dùng\n" - - msgid "" - " -e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE\n" -@@ -2353,8 +2288,8 @@ - " mentioned by the -G option without removing\n" - " him/her from other groups\n" - msgstr "" --" -a, --append phụ thêm người dùng vào các nhóm phụ\n" --" đưa ra bởi tuỳ chọn « -G » mà không gỡ bỏ ta " -+" -a, --append thêm người dùng vào các nhóm phụ\n" -+" đưa ra bởi tuỳ chọn “-G” mà không gỡ bỏ ta " - "khỏi nhóm khác\n" - - msgid " -l, --login NEW_LOGIN new value of the login name\n" -@@ -2367,9 +2302,9 @@ - " -m, --move-home move contents of the home directory to the\n" - " new location (use only with -d)\n" - msgstr "" --" -m, --move-home di chuyển nội dung của thư mục chính sang vị " -+" -m, --move-home di chuyển nội dung của thư mục riêng sang vị " - "trí mới\n" --" (chỉ dùng cùng với « -d »)\n" -+" (chỉ dùng cùng với “-d”)\n" - - msgid "" - " -o, --non-unique allow using duplicate (non-unique) UID\n" -@@ -2386,16 +2321,11 @@ - msgid " -U, --unlock unlock the user account\n" - msgstr " -U, --unlock mở khoá tài khoản người dùng\n" - --#, fuzzy --#| msgid "" --#| " -Z, --selinux-user new SELinux user mapping for the user " --#| "account\n" - msgid "" - " -Z, --selinux-user SEUSER new SELinux user mapping for the user " - "account\n" - msgstr "" --" -Z, --selinux-user sự ánh xạ SELinux mới cho tài khoản người " --"dùng\n" -+" -Z, --selinux-user SEUSER ánh xạ SELinux mới cho tài khoản người dùng\n" - - #, c-format - msgid "" -@@ -2404,29 +2334,28 @@ - msgstr "" - "%s: mở khoá mật khẩu của người dùng thì gây ra một tài khoản không có mật " - "khẩu.\n" --"Bạn nên đặt một mật khẩu dùng « usermod -p » để mở khoá mật khẩu của người " -+"Bạn nên đặt một mật khẩu dùng “usermod -p” để mở khoá mật khẩu của người " - "dùng này.\n" - - #, c-format - msgid "%s: user '%s' already exists in %s\n" --msgstr "%s: người dùng « %s » đã có trong %s\n" -+msgstr "%s: người dùng “%s” đã có trong %s\n" - --#, fuzzy, c-format --#| msgid "%s: cannot open %s\n" -+#, c-format - msgid "%s: no options\n" --msgstr "%s: không thể mở %s\n" -+msgstr "%s: không tùy chọn\n" - - #, c-format - msgid "%s: the -L, -p, and -U flags are exclusive\n" --msgstr "%s: các cờ « -L », « -p » và « -U » loại từ lẫn nhau\n" -+msgstr "%s: các cờ “-L”, “-p” và “-U” loại từ lẫn nhau\n" - - #, c-format - msgid "%s: shadow passwords required for -e and -f\n" --msgstr "%s: mật khẩu bóng cần thiết cho hai tùy chọn « -e » và « -f »\n" -+msgstr "%s: mật khẩu shadow cần cho hai tùy chọn “-e” và “-f”\n" - - #, c-format - msgid "%s: UID '%lu' already exists\n" --msgstr "%s: UID « %lu » đã có\n" -+msgstr "%s: UID “%lu” đã có\n" - - #, c-format - msgid "%s: directory %s exists\n" -@@ -2437,15 +2366,16 @@ - "%s: The previous home directory (%s) was not a directory. It is not removed " - "and no home directories are created.\n" - msgstr "" -+"%s: Thư mục riêng trước đó (%s) không là một thư mục. Nó chưa được gỡ bỏ và " -+"chưa tạo thư mục riêng (home).\n" - --#, fuzzy, c-format --#| msgid "%s: cannot create directory %s\n" -+#, c-format - msgid "%s: Failed to change ownership of the home directory" --msgstr "%s: không thể tạo thư mục %s\n" -+msgstr "%s: Gặp lỗi khi thay đổi chủ sở hữu của thư mục home (riêng)" - - #, c-format - msgid "%s: warning: failed to completely remove old home directory %s" --msgstr "%s: cảnh báo : lỗi gỡ bỏ hoàn toàn thư mục chính cũ %s" -+msgstr "%s: cảnh báo: gặp lỗi khi gỡ bỏ hoàn toàn thư mục riêng cũ %s" - - #, c-format - msgid "%s: cannot rename directory %s to %s\n" -@@ -2454,24 +2384,24 @@ - #, c-format - msgid "%s: failed to copy the lastlog entry of user %lu to user %lu: %s\n" - msgstr "" --"%s: không sao chép được mục nhập lastlog của người dùng %lu sang người dùng " -+"%s: gặp lỗi khi sao chép mục tin lastlog của người dùng %lu sang người dùng " - "%lu: %s\n" - - #, c-format - msgid "%s: failed to copy the faillog entry of user %lu to user %lu: %s\n" - msgstr "" --"%s: không sao chép được mục nhập faillog của người dùng %lu sang người dùng " -+"%s: không sao chép được mục tin faillog của người dùng %lu sang người dùng " - "%lu: %s\n" - - #, c-format - msgid "%s: warning: %s not owned by %s\n" --msgstr "%s: cảnh báo : %s không phải được %s sở hữu\n" -+msgstr "%s: cảnh báo: %s không do %s sở hữu\n" - - msgid "failed to change mailbox owner" --msgstr "lỗi thay đổi chủ hộp thư" -+msgstr "gặp lỗi khi thay đổi chủ hộp thư" - - msgid "failed to rename mailbox" --msgstr "lỗi thay đổi tên của hộp thư" -+msgstr "gặp lỗi khi thay đổi tên của hộp thư" - - #, c-format - msgid "" -@@ -2481,7 +2411,7 @@ - msgstr "" - "Bạn đã sửa đổi %s.\n" - "Để thống nhất thì bạn cũng có thể cần sửa đổi %s.\n" --"Hãy sử dụng câu lệnh « %s » để làm như thế.\n" -+"Hãy sử dụng câu lệnh “%s” để làm như thế.\n" - - msgid " -g, --group edit group database\n" - msgstr " -g, --group sửa đổi cơ sở dữ liệu nhóm\n" -@@ -2493,28 +2423,22 @@ - msgstr "" - " -s, --shadow sửa đổi cơ sở dữ liệu shadow hay gshadow\n" - --#, fuzzy --#| msgid " -u, --uid UID user ID of the new account\n" - msgid " -u, --user which user's tcb shadow file to edit\n" --msgstr " -u, --uid UID mã số người dùng của tài khoản mới\n" -+msgstr " -u, --user sửa tập tin shadow tcb của người này\n" - - #, c-format - msgid "%s: failed to remove %s\n" --msgstr "%s: không gỡ bỏ được %s\n" -+msgstr "%s: gặp lỗi khi gỡ bỏ %s\n" - - #, c-format - msgid "%s: %s is unchanged\n" - msgstr "%s: %s chưa thay đổi\n" - --#, fuzzy --#| msgid "failed to rename mailbox" - msgid "failed to create scratch directory" --msgstr "lỗi thay đổi tên của hộp thư" -+msgstr "gặp lỗi khi tạo thư mục hỗn tạp" - --#, fuzzy --#| msgid "%s: failed to drop privileges (%s)\n" - msgid "failed to drop privileges" --msgstr "%s: lỗi bỏ quyền truy cập (%s)\n" -+msgstr "gặp lỗi khi xóa đặc quyền" - - msgid "Couldn't get file context" - msgstr "Không thể lấy ngữ cảnh tập tin" -@@ -2522,10 +2446,8 @@ - msgid "setfscreatecon () failed" - msgstr "setfscreatecon () bị lỗi" - --#, fuzzy --#| msgid "%s: failed to drop privileges (%s)\n" - msgid "failed to gain privileges" --msgstr "%s: lỗi bỏ quyền truy cập (%s)\n" -+msgstr "gặp lỗi khi cấp đặc quyền" - - msgid "Couldn't lock file" - msgstr "Không thể khoá tập tin" -@@ -2533,39 +2455,28 @@ - msgid "Couldn't make backup" - msgstr "Không thể sao lưu" - --#, fuzzy --#| msgid "failed to rename mailbox" - msgid "failed to open scratch file" --msgstr "lỗi thay đổi tên của hộp thư" -+msgstr "gặp lỗi khi mở tập tin hỗn tạp" - --#, fuzzy --#| msgid "%s: failed to unlock %s\n" - msgid "failed to unlink scratch file" --msgstr "%s: lỗi mở khoá %s\n" -+msgstr "gặp lỗi khi bỏ liên kết tập tin hỗn tạp" - --#, fuzzy --#| msgid "failed to rename mailbox" - msgid "failed to stat edited file" --msgstr "lỗi thay đổi tên của hộp thư" -+msgstr "gặp lỗi khi lấy thống kê tập tin đã sửa" - --#, fuzzy --#| msgid "failed to change mailbox owner" - msgid "failed to allocate memory" --msgstr "lỗi thay đổi chủ hộp thư" -+msgstr "gặp lỗi khi phân bổ bộ nhớ" - --#, fuzzy --#| msgid "failed to rename mailbox" - msgid "failed to create backup file" --msgstr "lỗi thay đổi tên của hộp thư" -+msgstr "không thể tạo tập tin sao lưu dự phòng" - - #, c-format - msgid "%s: can't restore %s: %s (your changes are in %s)\n" - msgstr "%s: không thể phục hồi %s: %s (các thay đổi của bạn nằm trong %s)\n" - --#, fuzzy, c-format --#| msgid "%s: invalid base directory '%s'\n" -+#, c-format - msgid "%s: failed to find tcb directory for %s\n" --msgstr "%s: thư mục cơ ban không hợp lệ « %s »\n" -+msgstr "%s: gặp lỗi khi tìm thư mục tcb cho %s\n" - - #~ msgid " -c, --crypt-method the crypt method (one of %s)\n" - #~ msgstr " -c, --crypt-method phương pháp mật mã (một của %s)\n" -@@ -2575,7 +2486,7 @@ - #~ "\n" - #~ "Options:\n" - #~ msgstr "" --#~ "Sử dụng: vipw [tuỳ_chọn ...]\n" -+#~ "Cách dùng: vipw [tuỳ_chọn ...]\n" - #~ "\n" - #~ "Tuỳ chọn:\n" - -@@ -2603,7 +2514,7 @@ - #~ " -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS\n" - #~ "\n" - #~ msgstr "" --#~ "Sử dụng: chage [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n" -+#~ "Cách dùng: chage [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n" - #~ "\n" - #~ "Tuỳ chọn:\n" - #~ " -d, --lastday NGÀY_CUỐI đặt ngày thay đổi mật khẩu cuối cùng " -@@ -2631,12 +2542,12 @@ - #~ "Usage: %s [-f full_name] [-r room_no] [-w work_ph]\n" - #~ "\t[-h home_ph] [-o other] [user]\n" - #~ msgstr "" --#~ "Sử dụng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n" -+#~ "Cách dùng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n" - #~ "\t[-h điện_thoại_ở_nhà] [-o khác] [người_dùng]\n" - - #~ msgid "Usage: %s [-f full_name] [-r room_no] [-w work_ph] [-h home_ph]\n" - #~ msgstr "" --#~ "Sử dụng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n" -+#~ "Cách dùng: %s [-f họ_tên] [-r số_phòng] [-w điện_thoại_chỗ_làm]\n" - #~ "\t[-h điện_thoại_ở_nhà]\n" - - #~ msgid "" -@@ -2650,7 +2561,7 @@ - #~ " the MD5 algorithm\n" - #~ "%s\n" - #~ msgstr "" --#~ "Sử dụng: %s [tùy_chọn]\n" -+#~ "Cách dùng: %s [tùy_chọn]\n" - #~ "\n" - #~ "Tùy chọn:\n" - #~ " -c, --crypt-method phương pháp mã hoá (một của %s)\n" -@@ -2667,21 +2578,21 @@ - #~ " -s, --shell SHELL new login shell for the user account\n" - #~ "\n" - #~ msgstr "" --#~ "Sử dụng: chsh [tùy_chọn...] [ĐĂNG_NHẬP]\n" -+#~ "Cách dùng: chsh [tùy_chọn...] [ĐĂNG_NHẬP]\n" - #~ "\n" - #~ "Tùy chọn:\n" - #~ " -h, --help hiện _trợ giúp_ này rồi thoát\n" --#~ " -s, --shell TRÌNH_BAO trình bao đăng nhập mới\n" -+#~ " -s, --shell TRÌNH_BAO hệ vỏ đăng nhập mới\n" - #~ "\t\t\t\t\t\tcho tài khoản người dùng\n" - #~ "\n" - - #~ msgid "Usage: expiry {-f|-c}\n" - #~ msgstr "" --#~ "Sử dụng: expiry {-f|-c}\n" -+#~ "Cách dùng: expiry {-f|-c}\n" - #~ "[expiry: mãn hạn]\n" - - #~ msgid "faillog: Failed to get the entry for UID %lu\n" --#~ msgstr "faillog: không lấy được mục nhập cho UID %lu\n" -+#~ msgstr "faillog: không lấy được mục tin cho UID %lu\n" - - #~ msgid "faillog: Cannot open %s: %s\n" - #~ msgstr "faillog: không thể mở %s: %s\n" -@@ -2691,23 +2602,23 @@ - - #~ msgid "Usage: groupdel group\n" - #~ msgstr "" --#~ "Sử dụng: groupdel nhóm\n" -+#~ "Cách dùng: groupdel nhóm\n" - #~ "[groupdel: xoá nhóm]\n" - - #~ msgid "Usage: %s [-r] [-s] [group [gshadow]]\n" --#~ msgstr "Sử dụng: %s [-r] [-s] [nhóm [gshadow]]\n" -+#~ msgstr "Cách dùng: %s [-r] [-s] [nhóm [gshadow]]\n" - - #~ msgid "Usage: %s [-r] [-s] [group]\n" --#~ msgstr "Sử dụng: %s [-r] [-s] [nhóm]\n" -+#~ msgstr "Cách dùng: %s [-r] [-s] [nhóm]\n" - - #~ msgid "%s: -s and -r are incompatibile\n" --#~ msgstr "%s: hai tùy chọn « -s » và « -r » không tương thích với nhau\n" -+#~ msgstr "%s: hai tùy chọn “-s” và “-r” không tương thích với nhau\n" - - #~ msgid "Usage: grpconv\n" --#~ msgstr "Sử dụng: grpconv\n" -+#~ msgstr "Cách dùng: grpconv\n" - - #~ msgid "Usage: grpunconv\n" --#~ msgstr "Sử dụng: grpunconv\n" -+#~ msgstr "Cách dùng: grpunconv\n" - - #~ msgid "" - #~ "Usage: lastlog [options]\n" -@@ -2722,7 +2633,7 @@ - #~ "LOGIN\n" - #~ "\n" - #~ msgstr "" --#~ "Sử dụng: lastlog [tùy_chọn...]\n" -+#~ "Cách dùng: lastlog [tùy_chọn...]\n" - #~ "\n" - #~ "[lastlog: bản ghi cuối cùng]\n" - #~ "\n" -@@ -2764,7 +2675,7 @@ - #~ " change to MAX_DAYS\n" - #~ "\n" - #~ msgstr "" --#~ "Sử dụng: passwd [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n" -+#~ "Cách dùng: passwd [tuỳ_chọn ...] [ĐĂNG_NHẬP]\n" - #~ "\n" - #~ "Tuỳ chọn:\n" - #~ " -a, --all\t\t\tthông báo trạng thái mật khẩu về mọi tài khoản\n" -@@ -2789,218 +2700,3 @@ - #~ " -x, --maxdays NGÀY\tđặt thành số này số tối đa các ngày trước khi thay " - #~ "đổi được mật khẩu\n" - #~ "\n" -- --#, fuzzy --#~| msgid "Usage: %s [-q] [-r] [-s] [passwd [shadow]]\n" --#~ msgid "Usage: %s [-q] [-r] [passwd]\n" --#~ msgstr "" --#~ "Sử dụng: %s [-q] [-r] [-s] [passwd [shadow]]\n" --#~ "[passwd: mật khẩu\n" --#~ "shadow: bóng]\n" -- --#~ msgid "Usage: %s [-q] [-r] [-s] [passwd [shadow]]\n" --#~ msgstr "" --#~ "Sử dụng: %s [-q] [-r] [-s] [passwd [shadow]]\n" --#~ "[passwd: mật khẩu\n" --#~ "shadow: bóng]\n" -- --#~ msgid "Usage: pwconv\n" --#~ msgstr "Sử dụng: pwconv\n" -- --#~ msgid "Usage: pwunconv\n" --#~ msgstr "Sử dụng: pwunconv\n" -- --#~ msgid "Unknown id: %s\n" --#~ msgstr "Không rõ mã số : %s\n" -- --#~ msgid "No shell\n" --#~ msgstr "Không có trình bao\n" -- --#~ msgid "" --#~ "Usage: userdel [options] LOGIN\n" --#~ "\n" --#~ "Options:\n" --#~ " -f, --force force removal of files,\n" --#~ " even if not owned by user\n" --#~ " -h, --help display this help message and exit\n" --#~ " -r, --remove remove home directory and mail spool\n" --#~ "\n" --#~ msgstr "" --#~ "Sử dụng: userdel [tùy_chọn...] ĐĂNG_NHẬP\n" --#~ "\n" --#~ "Tùy chọn:\n" --#~ " -f, --force ép buộc gỡ bỏ tập tin, thậm chí nếu " --#~ "không\n" --#~ " được sở hữu bởi người dùng\n" --#~ " -h, --help hiển thị trợ giúp này, sau đó thoát\n" --#~ " -r, --remove gỡ bỏ thư mục chính và ống chỉ thư tín\n" --#~ "\n" -- --#~ msgid "%s: user %s is currently logged in\n" --#~ msgstr "%s: người dùng %s hiện thời được đăng nhập\n" -- --#~ msgid "" --#~ "Usage: usermod [options] LOGIN\n" --#~ "\n" --#~ "Options:\n" --#~ " -c, --comment COMMENT new value of the GECOS field\n" --#~ " -d, --home HOME_DIR new home directory for the user account\n" --#~ " -e, --expiredate EXPIRE_DATE set account expiration date to " --#~ "EXPIRE_DATE\n" --#~ " -f, --inactive INACTIVE set password inactive after expiration\n" --#~ " to INACTIVE\n" --#~ " -g, --gid GROUP force use GROUP as new primary group\n" --#~ " -G, --groups GROUPS new list of supplementary GROUPS\n" --#~ " -a, --append append the user to the supplemental " --#~ "GROUPS\n" --#~ " mentioned by the -G option without " --#~ "removing\n" --#~ " him/her 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" --#~ " -m, --move-home move contents of the home directory to " --#~ "the\n" --#~ " new location (use only with -d)\n" --#~ " -o, --non-unique allow using duplicate (non-unique) UID\n" --#~ " -p, --password PASSWORD use encrypted password for the new " --#~ "password\n" --#~ " -s, --shell SHELL new login shell for the user account\n" --#~ " -u, --uid UID new UID for the user account\n" --#~ " -U, --unlock unlock the user account\n" --#~ "%s\n" --#~ msgstr "" --#~ "Sử dụng: usermod [tuỳ_chọn...] ĐĂNG_NHẬP\n" --#~ "\n" --#~ "Tuỳ chọn:\n" --#~ " -c, --comment GHI_LƯU\t\tgiá trị mới của trường GECOS\n" --#~ " -d, --home THƯ_MỤC \tthư mục chính mới cho tài khoản người " --#~ "dùng\n" --#~ " -e, --expiredate NGÀY \t\tđặt thành ngày này ngày hết hạn dùng tài " --#~ "khoản\n" --#~ " -f, --inactive INACTIVE \tđặt thành INACTIVE mật khẩu không còn " --#~ "hoạt động lại\n" --#~ "\t\t\t\t\t\tsau khi hết hạn dùng\n" --#~ " -g, --gid NHÓM \t\tép buộc sử dụng nhóm này làm nhóm " --#~ "chính mới\n" --#~ " -G, --groups NHÓM \tdanh sách mới chứa các nhóm phụ\n" --#~ " -a, --append \t\tphụ thêm người dùng vào các nhóm phụ\n" --#~ "\t\t\t\t\t\tđưa ra bởi tuỳ chọn « -G » mà không gỡ bỏ ta khỏi nhóm khác\n" --#~ " -h, --help \t\thiển thị trợ giúp này, sau đó thoát\n" --#~ " -l, --login ĐĂNG_NHẬP \tgiá trị mới của tên đăng nhập\n" --#~ " -L, --lock \t\tkhoá tài khoản người dùng\n" --#~ " -m, --move-home \tdi chuyển nội dung của thư mục chính " --#~ "sang vị trí mới\n" --#~ "\t\t\t\t\t\t(chỉ dùng cùng với « -d »)\n" --#~ " -o, --non-unique \t\tcho phép sử dụng UID trùng (không duy " --#~ "nhất)\n" --#~ " -p, --password MẬT_KHẨU \tmật mã hoá mật khẩu mới\n" --#~ " -s, --shell TRÌNH_BAO trình bao đăng nhập mới cho tài khoản " --#~ "người dùng\n" --#~ " -u, --uid UID \t\tUID mới cho tài khoản người dùng\n" --#~ " -U, --unlock \t\tmở khoá tài khoản người dùng\n" --#~ "%s\n" -- --#~ msgid "%s: no flags given\n" --#~ msgstr "%s: chưa đưa ra cờ\n" -- --#, fuzzy --#~| msgid "" --#~| "Usage: vipw [options]\n" --#~| "\n" --#~| "Options:\n" --#~| " -g, --group edit group database\n" --#~| " -h, --help display this help message and exit\n" --#~| " -p, --passwd edit passwd database\n" --#~| " -q, --quiet quiet mode\n" --#~| " -s, --shadow edit shadow or gshadow database\n" --#~| "\n" --#~ msgid "" --#~ "Usage: vipw [options]\n" --#~ "\n" --#~ "Options:\n" --#~ " -g, --group edit group database\n" --#~ " -h, --help display this help message and exit\n" --#~ " -p, --passwd edit passwd database\n" --#~ " -q, --quiet quiet mode\n" --#~ " -s, --shadow edit shadow or gshadow database\n" --#~ " -u, --user which user's tcb shadow file to edit\n" --#~ "\n" --#~ msgstr "" --#~ "Sử dụng: vipw [tùy_chọn...]\n" --#~ "\n" --#~ "Tùy chọn:\n" --#~ " -g, --group sửa đổi cơ sở dữ liệu nhóm\n" --#~ " -h, --help hiển thị trợ giúp này, sau đó thoát\n" --#~ " -p, --passwd sửa đổi cơ sở dữ liệu passwd\n" --#~ " -q, --quiet chế độ im (không xuất chi tiết)\n" --#~ " -s, --shadow sửa đổi cơ sở dữ liệu shadow hay gshadow\n" --#~ "\n" -- --#~ msgid "" --#~ "Usage: %s [option] GROUP\n" --#~ "\n" --#~ "Options:\n" --#~ " -a, --add USER add USER to GROUP\n" --#~ " -d, --delete USER remove USER from GROUP\n" --#~ " -r, --remove-password remove the GROUP's password\n" --#~ " -R, --restrict restrict access to GROUP to its members\n" --#~ " -M, --members USER,... set the list of members of GROUP\n" --#~ "%s\n" --#~ "\n" --#~ msgstr "" --#~ "Sử dụng: %s [tuỳ_chọn] NHÓM\n" --#~ "\n" --#~ "Tuỳ chọn:\n" --#~ " -a, --add NGƯỜI_DÙNG\tthêm người dùng này vào NHÓM\n" --#~ " -d, --delete NGƯỜI_DÙNG \tgỡ bỏ người dùng này khỏi NHÓM\n" --#~ " -r, --remove-password \tgỡ bỏ mật khẩu của NHÓM\n" --#~ " -R, --restrict \t\t\t\thạn chế truy cập đến NHÓM thành các thành viên " --#~ "của nó\n" --#~ " -M, --members NGƯỜI_DÙNG,...\t\tđặt danh sách các thành viên của NHÓM\n" --#~ "%s\n" --#~ "\n" -- --#~ msgid "" --#~ "Usage: groupmems [options] [action]\n" --#~ "\n" --#~ "Options:\n" --#~ " -g, --group groupname change groupname instead of the user's " --#~ "group\n" --#~ " (root only)\n" --#~ "\n" --#~ "Actions:\n" --#~ " -a, --add username add username to the members of the group\n" --#~ " -d, --delete username remove username from the members of the " --#~ "group\n" --#~ " -p, --purge purge all members from the group\n" --#~ " -l, --list list the members of the group\n" --#~ "\n" --#~ msgstr "" --#~ "Sử dụng: groupmems [tuỳ_chọn ...] [hành_vi]\n" --#~ "\n" --#~ "Tuỳ chọn:\n" --#~ " -g, --group TÊN_NHÓM thay đổi tên của nhóm này thay cho nhóm của " --#~ "người dùng (chỉ người chủ)\n" --#~ "\n" --#~ "Hành vi:\n" --#~ " -a, --add TÊN\t\t\tthêm tên người dùng này vào nhóm\n" --#~ " -d, --delete TÊN \tgỡ bỏ tên này khỏi nhóm\n" --#~ " -p, --purge \ttẩy mọi người ra nhóm\n" --#~ " -l, --list \t\tliệt kê những người trong nhóm\n" --#~ "\n" -- --#~ msgid "" --#~ "Usage: useradd [options] LOGIN\n" --#~ "\n" --#~ "Options:\n" --#~ msgstr "" --#~ "Sử dụng: useradd [tuỳ_chọn ...] ĐĂNG_NHẬP\n" --#~ "\n" --#~ "Tuỳ chọn:\n" -- --#~ msgid "%s: can't create %s\n" --#~ msgstr "%s: không thể tạo %s\n" -- --#~ msgid "%s: can't chown %s\n" --#~ msgstr "%s: không thể chown (thay đổi quyền sở hữu) %s\n" diff --git a/debian/patches/1011_french_translation b/debian/patches/1011_french_translation deleted file mode 100644 index 27968415..00000000 --- a/debian/patches/1011_french_translation +++ /dev/null @@ -1,1430 +0,0 @@ -Index: git/man/po/fr.po -=================================================================== ---- git.orig/man/po/fr.po -+++ git/man/po/fr.po -@@ -1,7 +1,7 @@ - # translation of shadow-man.po to French - # French translation of the shadow's man pages - # Traduction des pages de manuel livrées avec shadow --# Copyright (C) 2011, 2012 Debian French l10n team -+# Copyright (C) 2011-2013 Debian French l10n team - # - # Certaines pages étaient déjà traduites: - # chpasswd: Amand Tihon -@@ -16,19 +16,19 @@ - # shadow(5): Thierry Vignaud , 1999. - # useradd: Frédéric Delanoy, 2000. - # Christian Perrier , 2009, 2012. --# Thomas Blein , 2011, 2012. -+# Thomas Blein , 2011, 2012, 2013. - msgid "" - msgstr "" - "Project-Id-Version: shadow-man-pages 4.0.18\n" - "POT-Creation-Date: 2013-08-23 01:54+0200\n" --"PO-Revision-Date: 2013-08-23 01:37+0200\n" -+"PO-Revision-Date: 2013-07-10 19:08+0200\n" - "Last-Translator: Thomas Blein \n" - "Language-Team: French \n" - "Language: fr\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" --"X-Generator: Lokalize 1.2\n" -+"X-Generator: Lokalize 1.4\n" - "X-Poedit-Language: French\n" - "X-Poedit-Country: FRANCE\n" - "Plural-Forms: nplurals=2; plural=(n > 1);\n" -@@ -36,16 +36,16 @@ - #: vipw.8.xml:41(firstname) suauth.5.xml:39(firstname) - #: pwconv.8.xml:45(firstname) login.access.5.xml:40(firstname) - msgid "Marek" --msgstr "" -+msgstr "Marek" - - #: vipw.8.xml:42(surname) suauth.5.xml:40(surname) pwconv.8.xml:46(surname) - #: login.access.5.xml:41(surname) - msgid "Michałkiewicz" --msgstr "" -+msgstr "Michałkiewicz" - - #: vipw.8.xml:43(contrib) limits.5.xml:43(contrib) - msgid "Creation, 1997" --msgstr "" -+msgstr "Création, 1997" - - #: vipw.8.xml:46(firstname) usermod.8.xml:50(firstname) - #: userdel.8.xml:50(firstname) useradd.8.xml:61(firstname) -@@ -66,7 +66,7 @@ - #: chpasswd.8.xml:48(firstname) chgpasswd.8.xml:44(firstname) - #: chfn.1.xml:47(firstname) chage.1.xml:45(firstname) - msgid "Thomas" --msgstr "" -+msgstr "Thomas" - - #: vipw.8.xml:47(surname) usermod.8.xml:51(surname) userdel.8.xml:51(surname) - #: useradd.8.xml:62(surname) suauth.5.xml:45(surname) su.1.xml:62(surname) -@@ -84,7 +84,7 @@ - #: expiry.1.xml:49(surname) chsh.1.xml:48(surname) chpasswd.8.xml:49(surname) - #: chgpasswd.8.xml:45(surname) chfn.1.xml:48(surname) chage.1.xml:46(surname) - msgid "Kłoczko" --msgstr "" -+msgstr "Kłoczko" - - #: vipw.8.xml:48(email) usermod.8.xml:52(email) userdel.8.xml:52(email) - #: useradd.8.xml:63(email) suauth.5.xml:46(email) su.1.xml:63(email) -@@ -100,7 +100,7 @@ - #: chpasswd.8.xml:50(email) chgpasswd.8.xml:46(email) chfn.1.xml:49(email) - #: chage.1.xml:47(email) - msgid "kloczek@pld.org.pl" --msgstr "" -+msgstr "kloczek@pld.org.pl" - - #: vipw.8.xml:49(contrib) usermod.8.xml:53(contrib) userdel.8.xml:53(contrib) - #: useradd.8.xml:64(contrib) suauth.5.xml:47(contrib) su.1.xml:64(contrib) -@@ -118,7 +118,7 @@ - #: expiry.1.xml:51(contrib) chsh.1.xml:50(contrib) chpasswd.8.xml:51(contrib) - #: chfn.1.xml:50(contrib) chage.1.xml:48(contrib) - msgid "shadow-utils maintainer, 2000 - 2007" --msgstr "" -+msgstr "Mainteneur de shadow-utils, 2000 - 2007" - - #: vipw.8.xml:52(firstname) usermod.8.xml:56(firstname) - #: userdel.8.xml:56(firstname) useradd.8.xml:67(firstname) -@@ -140,7 +140,7 @@ - #: chpasswd.8.xml:54(firstname) chgpasswd.8.xml:50(firstname) - #: chfn.1.xml:53(firstname) chage.1.xml:51(firstname) - msgid "Nicolas" --msgstr "" -+msgstr "Nicolas" - - #: vipw.8.xml:53(surname) usermod.8.xml:57(surname) userdel.8.xml:57(surname) - #: useradd.8.xml:68(surname) suauth.5.xml:51(surname) su.1.xml:68(surname) -@@ -159,7 +159,7 @@ - #: chpasswd.8.xml:55(surname) chgpasswd.8.xml:51(surname) - #: chfn.1.xml:54(surname) chage.1.xml:52(surname) - msgid "François" --msgstr "" -+msgstr "François" - - #: vipw.8.xml:54(email) usermod.8.xml:58(email) userdel.8.xml:58(email) - #: useradd.8.xml:69(email) suauth.5.xml:52(email) su.1.xml:69(email) -@@ -176,7 +176,7 @@ - #: chpasswd.8.xml:56(email) chgpasswd.8.xml:52(email) chfn.1.xml:55(email) - #: chage.1.xml:53(email) - msgid "nicolas.francois@centraliens.net" --msgstr "" -+msgstr "nicolas.francois@centraliens.net" - - #: vipw.8.xml:55(contrib) usermod.8.xml:59(contrib) userdel.8.xml:59(contrib) - #: useradd.8.xml:70(contrib) suauth.5.xml:53(contrib) su.1.xml:70(contrib) -@@ -195,7 +195,7 @@ - #: chpasswd.8.xml:57(contrib) chgpasswd.8.xml:53(contrib) - #: chfn.1.xml:56(contrib) chage.1.xml:54(contrib) - msgid "shadow-utils maintainer, 2007 - now" --msgstr "" -+msgstr "Mainteneur de shadow-utils, 2007 - maintenant" - - #: vipw.8.xml:59(refentrytitle) vipw.8.xml:66(refname) vipw.8.xml:75(command) - #: login.defs.5.xml:507(term) -@@ -388,11 +388,15 @@ - #: groupdel.8.xml:101(term) groupadd.8.xml:204(term) faillog.8.xml:180(term) - #: chsh.1.xml:107(term) chpasswd.8.xml:188(term) chgpasswd.8.xml:146(term) - #: chfn.1.xml:153(term) chage.1.xml:197(term) -+#, fuzzy -+#| msgid "" -+#| ", CHROOT_DIR" - msgid "" - ",  CHROOT_DIR" - msgstr "" --",  RÉP_CHROOT-R, RÉP_CHROOT" - - #: vipw.8.xml:142(para) usermod.8.xml:315(para) userdel.8.xml:150(para) -@@ -650,7 +654,7 @@ - #: chsh.1.xml:42(firstname) chpasswd.8.xml:43(firstname) - #: chfn.1.xml:42(firstname) chage.1.xml:40(firstname) - msgid "Julianne Frances" --msgstr "" -+msgstr "Julianne Frances" - - #: usermod.8.xml:46(surname) userdel.8.xml:46(surname) - #: useradd.8.xml:57(surname) su.1.xml:57(surname) sg.1.xml:41(surname) -@@ -665,7 +669,7 @@ - #: faillog.5.xml:40(surname) expiry.1.xml:44(surname) chsh.1.xml:43(surname) - #: chpasswd.8.xml:44(surname) chfn.1.xml:43(surname) chage.1.xml:41(surname) - msgid "Haugh" --msgstr "" -+msgstr "Haugh" - - #: usermod.8.xml:47(contrib) userdel.8.xml:47(contrib) - #: useradd.8.xml:58(contrib) sg.1.xml:42(contrib) newusers.8.xml:56(contrib) -@@ -674,7 +678,7 @@ - #: groupmod.8.xml:42(contrib) groupdel.8.xml:42(contrib) - #: groupadd.8.xml:44(contrib) chpasswd.8.xml:45(contrib) - msgid "Creation, 1991" --msgstr "" -+msgstr "Création, 1991" - - #: usermod.8.xml:63(refentrytitle) usermod.8.xml:70(refname) - #: usermod.8.xml:76(command) login.defs.5.xml:498(term) -@@ -719,12 +723,16 @@ - "qu'avec l'option ." - - #: usermod.8.xml:111(term) useradd.8.xml:150(term) -+#, fuzzy -+#| msgid "" -+#| ", COMMENT" - msgid "" - ",  COMMENT" - msgstr "" --",  " --"COMMENTAIRE" -+", COMMENTAIRE" - - #: usermod.8.xml:115(para) - msgid "" -@@ -740,14 +748,14 @@ - #: usermod.8.xml:124(term) - #, fuzzy - #| msgid "" --#| ",  " --#| "HOME_DIR" -+#| ", HOME_DIR" - msgid "" - ",  HOME_DIR" - msgstr "" --",  " --"RÉP_PERSO" -+", RÉP_PERSO" - - #: usermod.8.xml:128(para) - msgid "The user's new login directory." -@@ -764,11 +772,15 @@ - "créé si nécessaire." - - #: usermod.8.xml:140(term) useradd.8.xml:188(term) useradd.8.xml:548(term) -+#, fuzzy -+#| msgid "" -+#| ", ,  " - "EXPIRE_DATE" - msgstr "" --",  " -+", " - "DATE_FIN_VALIDITÉ" - - #: usermod.8.xml:144(para) useradd.8.xml:192(para) -@@ -796,11 +808,15 @@ - "entrée /etc/shadow sera créée si il n'y en avait pas." - - #: usermod.8.xml:160(term) useradd.8.xml:205(term) useradd.8.xml:560(term) -+#, fuzzy -+#| msgid "" -+#| ", INACTIVE" - msgid "" - ",  INACTIVE" - msgstr "" --",  " -+", " - "DURÉE_INACTIVITÉ" - - #: usermod.8.xml:164(para) -@@ -820,12 +836,15 @@ - "de validité, et une valeur de -1 désactive cette fonctionnalité." - - #: usermod.8.xml:181(term) useradd.8.xml:224(term) useradd.8.xml:575(term) -+#, fuzzy -+#| msgid "" -+#| ", GROUP" - msgid "" - ",  GROUP" - msgstr "" --",  GROUPE" -+", GROUPE" - - #: usermod.8.xml:185(para) - msgid "" -@@ -852,12 +871,17 @@ - "l'utilisateur doit être modifié manuellement." - - #: usermod.8.xml:200(term) useradd.8.xml:251(term) -+#, fuzzy -+#| msgid "" -+#| ", GROUP1[,GROUP2,...[,GROUPN]]]" - msgid "" - ",  GROUP1[,GROUP2,...[,GROUPN]]]" - msgstr "" --",  GROUPE1-G, GROUPE1[,GROUPE2,...[,GROUPEN]]]" - -@@ -886,12 +910,16 @@ - "actuelle des groupes supplémentaires." - - #: usermod.8.xml:220(term) -+#, fuzzy -+#| msgid "" -+#| ", NEW_LOGIN" - msgid "" - ",  NEW_LOGIN" - msgstr "" --",  " --"NOUVEAU_LOGIN" -+", NOUVEAU_LOGIN" - - #: usermod.8.xml:224(para) - msgid "" -@@ -974,12 +1002,16 @@ - - #: usermod.8.xml:284(term) useradd.8.xml:397(term) groupmod.8.xml:157(term) - #: groupadd.8.xml:167(term) -+#, fuzzy -+#| msgid "" -+#| ", PASSWORD" - msgid "" - ",  PASSWORD" - msgstr "" --",  " --"MOT_DE_PASSE" -+", MOT_DE_PASSE" - - #: usermod.8.xml:288(para) groupmod.8.xml:161(para) - msgid "" -@@ -1021,12 +1053,16 @@ - - #: usermod.8.xml:323(term) useradd.8.xml:457(term) useradd.8.xml:595(term) - #: su.1.xml:187(term) chsh.1.xml:119(term) -+#, fuzzy -+#| msgid "" -+#| ", SHELL" - msgid "" - ",  SHELL" - msgstr "" --",  " --"INTERPRÉTEUR" -+", INTERPRÉTEUR" - - #: usermod.8.xml:327(para) chsh.1.xml:123(para) - msgid "" -@@ -1038,12 +1074,14 @@ - "de commandes initial par défaut." - - #: usermod.8.xml:334(term) useradd.8.xml:471(term) -+#, fuzzy -+#| msgid "" -+#| ", UID" - msgid "" - ",  UID" - msgstr "" --",  UID" -+", UID" - - #: usermod.8.xml:338(para) - msgid "The new numerical value of the user's ID." -@@ -1115,13 +1153,13 @@ - #: usermod.8.xml:384(term) - #, fuzzy - #| msgid "" --#| ",  LOGIN-u, LOGIN|RANGE" - msgid "" - ",  " - "FIRST-LAST" - msgstr "" --",  LOGIN-u, LOGIN|INTERVALLE" - - #: usermod.8.xml:388(para) -@@ -1152,13 +1190,13 @@ - #: usermod.8.xml:402(term) - #, fuzzy - #| msgid "" --#| ",  LOGIN-u, LOGIN|RANGE" - msgid "" - ",  " - "FIRST-LAST" - msgstr "" --",  LOGIN-u, LOGIN|INTERVALLE" - - #: usermod.8.xml:406(para) -@@ -1176,13 +1214,13 @@ - #: usermod.8.xml:422(term) - #, fuzzy - #| msgid "" --#| ",  LOGIN-u, LOGIN|RANGE" - msgid "" - ",  " - "FIRST-LAST" - msgstr "" --",  LOGIN-u, LOGIN|INTERVALLE" - - #: usermod.8.xml:426(para) -@@ -1207,13 +1245,13 @@ - #: usermod.8.xml:440(term) - #, fuzzy - #| msgid "" --#| ",  LOGIN-u, LOGIN|RANGE" - msgid "" - ",  " - "FIRST-LAST" - msgstr "" --",  LOGIN-u, LOGIN|INTERVALLE" - - #: usermod.8.xml:444(para) -@@ -1233,11 +1271,15 @@ - msgstr "" - - #: usermod.8.xml:460(term) useradd.8.xml:506(term) -+#, fuzzy -+#| msgid "" -+#| ", SEUSER" - msgid "" - ",  " - "SEUSER" - msgstr "" --",  " -+", " - "UTILISATEUR_SELINUX" - - #: usermod.8.xml:464(para) -@@ -2116,14 +2158,25 @@ - "Les options disponibles pour la commande useradd sont :" - - #: useradd.8.xml:129(term) useradd.8.xml:530(term) -+#, fuzzy -+#| msgid "" -+#| ", BASE_DIR" - msgid "" - ",  BASE_DIR" - msgstr "" --",  RÉP_BASE-b, RÉP_BASE" - - #: useradd.8.xml:133(para) -+#, fuzzy -+#| msgid "" -+#| "The default base directory for the system if option is not " -+#| "used, BASE_DIR must exist." - msgid "" - "The default base directory for the system if  " - "HOME_DIR is not specified. BASE_DIR-m option is not used, " - "BASE_DIR must exist." - msgstr "" --"Répertoire de base par défaut du système si l'option " -+"RÉP_PERSO n'est pas spécifiée. " - "RÉP_BASE est concaténé avec le nom du compte pour " - "définir le répertoire personnel. Quand l'option n'est " - "pas utilisée, RÉP_BASE doit exister." -@@ -2158,12 +2211,16 @@ - "l'utilisateur." - - #: useradd.8.xml:162(term) -+#, fuzzy -+#| msgid "" -+#| ", HOME_DIR" - msgid "" - ",  HOME_DIR" - msgstr "" --",  " --"RÉP_PERSO" -+", RÉP_PERSO" - - #: useradd.8.xml:166(para) - msgid "" -@@ -2271,12 +2328,16 @@ - "l'utilisateur est de n'appartenir qu'au groupe initial." - - #: useradd.8.xml:272(term) -+#, fuzzy -+#| msgid "" -+#| ", SKEL_DIR" - msgid "" - ",  SKEL_DIR" - msgstr "" --",  " --"RÉP_SQUELETTE" -+", RÉP_SQUELETTE" - - #: useradd.8.xml:276(para) - msgid "" -@@ -2311,14 +2372,30 @@ - msgstr "Si possible, les ACL et les attributs étendus seront copiés." - - #: useradd.8.xml:297(term) groupadd.8.xml:137(term) -+#, fuzzy -+#| msgid "" -+#| ", KEY=VALUE" - msgid "" - ",  KEY=VALUE" - msgstr "" --",  CLÉ-K, CLÉ=VALEUR" - - #: useradd.8.xml:301(para) -+#, fuzzy -+#| msgid "" -+#| "Overrides /etc/login.defs defaults (, , " -+#| " and others). Example: " -+#| "PASS_MAX_DAYS=-1 can be used when creating " -+#| "system account to turn off password ageing, even though system account " -+#| "has no password at all. Multiple options can be " -+#| "specified, e.g.: UID_MIN=100, , " -@@ -2334,13 +2411,13 @@ - "Surcharge les valeurs par défaut de /etc/login.defs " - "(, , , " - " et autres). Par exemple : " --" PASS_MAX_DAYS-K PASS_MAX_DAYS=-1 peut être utilisé pour la " - "création de comptes système pour désactiver la gestion de la durée de " - "validité des mots de passe, même si les comptes système n'ont pas de mot de " - "passe. Plusieurs options peuvent être précisées, comme " --"par exemple :  UID_MIN=100  " -+"par exemple : UID_MIN=100 " - "UID_MAX=499" - - #: useradd.8.xml:322(term) -@@ -2991,14 +3068,12 @@ - msgstr "impossible de créer le répertoire personnel" - - #: useradd.8.xml:794(replaceable) --#, fuzzy --#| msgid "1" - msgid "14" --msgstr "1" -+msgstr "14" - - #: useradd.8.xml:796(para) - msgid "can't update SELinux user mapping" --msgstr "" -+msgstr "Impossible de mettre à jour la correspondance d'utilisateur SELinux" - - #: useradd.8.xml:736(para) - msgid "" -@@ -3071,7 +3146,7 @@ - #: suauth.5.xml:41(contrib) pwconv.8.xml:47(contrib) - #: login.access.5.xml:42(contrib) gpasswd.1.xml:46(contrib) - msgid "Creation, 1996" --msgstr "" -+msgstr "Création, 1996" - - #: suauth.5.xml:57(refentrytitle) suauth.5.xml:64(refname) - msgid "suauth" -@@ -3322,7 +3397,7 @@ - #: passwd.1.xml:48(contrib) login.1.xml:74(contrib) faillog.8.xml:41(contrib) - #: faillog.5.xml:41(contrib) - msgid "Creation, 1989" --msgstr "" -+msgstr "Création, 1989" - - #: su.1.xml:74(refentrytitle) su.1.xml:81(refname) su.1.xml:86(command) - #: login.defs.5.xml:446(term) -@@ -3429,11 +3504,15 @@ - msgstr "Les options applicables à la commande su sont :" - - #: su.1.xml:150(term) -+#, fuzzy -+#| msgid "" -+#| ", COMMAND" - msgid "" - ",  COMMAND" - msgstr "" --",  COMMANDE-c, COMMANDE" - - #: su.1.xml:154(para) -@@ -4897,7 +4976,7 @@ - - #: pwck.8.xml:47(contrib) lastlog.8.xml:42(contrib) grpck.8.xml:42(contrib) - msgid "Creation, 1992" --msgstr "" -+msgstr "Création, 1992" - - #: pwck.8.xml:63(refentrytitle) pwck.8.xml:70(refname) pwck.8.xml:76(command) - #: login.defs.5.xml:420(term) -@@ -5603,11 +5682,15 @@ - "connexion." - - #: passwd.1.xml:220(term) -+#, fuzzy -+#| msgid "" -+#| ", INACTIVE" - msgid "" - ",  INACTIVE" - msgstr "" --",  " -+", " - "DURÉE_INACTIVITÉ" - - # NOTE: Only this user account -@@ -5673,11 +5756,15 @@ - "changer." - - #: passwd.1.xml:269(term) -+#, fuzzy -+#| msgid "" -+#| ", MIN_DAYS" - msgid "" - ",  MIN_DAYS" - msgstr "" --",  JOURS_MIN-n, JOURS_MIN" - - #: passwd.1.xml:273(para) chage.1.xml:168(para) -@@ -5691,12 +5778,16 @@ - "indique que l'utilisateur peut changer son mot de passe quand il le souhaite." - - #: passwd.1.xml:291(term) -+#, fuzzy -+#| msgid "" -+#| ", ,  " - "REPOSITORY" - msgstr "" --",  " --"REPOSITORY" -+", REPOSITORY" - - #: passwd.1.xml:295(para) - msgid "change password in REPOSITORY repository" -@@ -5741,11 +5832,15 @@ - "présente avant l'utilisation de l'option )." - - #: passwd.1.xml:344(term) -+#, fuzzy -+#| msgid "" -+#| ", WARN_DAYS" - msgid "" - ",  " - "WARN_DAYS" - msgstr "" --",  " -+", " - "DURÉE_AVERTISSEMENT" - - #: passwd.1.xml:348(para) -@@ -5762,11 +5857,15 @@ - "d'arriver en fin de validité." - - #: passwd.1.xml:357(term) -+#, fuzzy -+#| msgid "" -+#| ", MAX_DAYS" - msgid "" - ",  MAX_DAYS" - msgstr "" --",  JOURS_MAX-x, JOURS_MAX" - - #: passwd.1.xml:361(para) -@@ -5940,8 +6039,8 @@ - #: passwd.1.xml:35(para) login.defs.5.xml:35(para) - msgid "" - "Number of significant characters in the password for crypt(). " --" is 8 by default. Don't change unless your crypt" --"() is better. This is ignored if set to " -+" is 8 by default. Don't change unless your " -+"crypt() is better. This is ignored if set to " - "yes." - msgstr "" - "Nombre de caractères significatifs dans le mot de passe pour crypt(). La " -@@ -7723,11 +7822,11 @@ - - #: limits.5.xml:41(firstname) - msgid "Luca" --msgstr "" -+msgstr "Luca" - - #: limits.5.xml:42(surname) - msgid "Berra" --msgstr "" -+msgstr "Berra" - - #: limits.5.xml:59(refentrytitle) limits.5.xml:66(refname) - msgid "limits" -@@ -8019,11 +8118,15 @@ - "Les options disponibles pour la commande lastlog sont :" - - #: lastlog.8.xml:97(term) -+#, fuzzy -+#| msgid "" -+#| ", DAYS" - msgid "" - ",  DAYS" - msgstr "" --",  JOURS-b, JOURS" - - #: lastlog.8.xml:101(para) -@@ -8034,12 +8137,15 @@ - "remap=\"I\">JOURS." - - #: lastlog.8.xml:127(term) faillog.8.xml:192(term) -+#, fuzzy -+#| msgid "" -+#| ", DAYS" - msgid "" - ",  DAYS" - msgstr "" --",  JOURS" -+", JOURS" - - #: lastlog.8.xml:131(para) - msgid "" -@@ -8050,11 +8156,15 @@ - "\">JOURS." - - #: lastlog.8.xml:138(term) faillog.8.xml:202(term) -+#, fuzzy -+#| msgid "" -+#| ", LOGIN|RANGE" - msgid "" - ",  LOGIN|RANGE" - msgstr "" --",  LOGIN-u, LOGIN|INTERVALLE" - - #: lastlog.8.xml:142(para) -@@ -8143,7 +8253,7 @@ - - #: gshadow.5.xml:41(contrib) - msgid "Creation, 2005" --msgstr "" -+msgstr "Création, 2005" - - #: gshadow.5.xml:46(refentrytitle) gshadow.5.xml:53(refname) - msgid "gshadow" -@@ -8383,14 +8493,6 @@ - "\"gshadow\">et /etc/gshadow par GID." - - #: grpck.8.xml:196(para) --#, fuzzy --#| msgid "" --#| "By default, grpck operates on /etc/group and /etc/gshadow. The user may select alternate files with the " --#| "groupparameter.and shadow parameters." - msgid "" - "By default, grpck operates on /etc/groupand /etc/gshadowgroupmod sont :" - - #: groupmod.8.xml:96(term) groupadd.8.xml:114(term) -+#, fuzzy -+#| msgid "" -+#| ", GID" - msgid "" - ",  GID" - msgstr "" --",  GID" -+", GID" - - #: groupmod.8.xml:100(para) - msgid "" -@@ -8588,11 +8692,15 @@ - " du fichier /etc/login.defs." - - #: groupmod.8.xml:135(term) -+#, fuzzy -+#| msgid "" -+#| ", NEW_GROUP" - msgid "" - ",  " - "NEW_GROUP" - msgstr "" --",  " -+", " - "NOUVEAU_NOM_GROUPE" - - #: groupmod.8.xml:139(para) -@@ -8660,19 +8768,19 @@ - - #: groupmems.8.xml:42(firstname) - msgid "George" --msgstr "" -+msgstr "George" - - #: groupmems.8.xml:43(surname) - msgid "Kraft" --msgstr "" -+msgstr "Kraft" - - #: groupmems.8.xml:44(lineage) - msgid "IV" --msgstr "" -+msgstr "IV" - - #: groupmems.8.xml:45(contrib) - msgid "Creation, 2000" --msgstr "" -+msgstr "Création, 2000" - - #: groupmems.8.xml:69(refpurpose) - msgid "administer members of a user's primary group" -@@ -8732,12 +8840,16 @@ - "Les options disponibles pour la commande groupmems sont :" - - #: groupmems.8.xml:107(term) -+#, fuzzy -+#| msgid "" -+#| ", user_name" - msgid "" - ",  user_name" - msgstr "" --",  " --"nom_utilisateur" -+", nom_utilisateur" - - #: groupmems.8.xml:109(para) - msgid "Add an user to the group membership list." -@@ -8754,12 +8866,16 @@ - "a pas d'entrée, une nouvelle entrée sera créée." - - #: groupmems.8.xml:118(term) -+#, fuzzy -+#| msgid "" -+#| ", user_name" - msgid "" - ",  user_name" - msgstr "" --",  " --"nom_utilisateur" -+", nom_utilisateur" - - #: groupmems.8.xml:120(para) - msgid "Delete a user from the group membership list." -@@ -8774,11 +8890,15 @@ - "retiré de la liste des membres et des administrateurs du groupe." - - #: groupmems.8.xml:134(term) -+#, fuzzy -+#| msgid "" -+#| ", group_name" - msgid "" - ",  group_name" - msgstr "" --",  nom_groupe-g, nom_groupe" - - #: groupmems.8.xml:136(para) -@@ -9013,22 +9133,32 @@ - "être indiquée plusieurs fois." - - #: groupadd.8.xml:146(para) -+#, fuzzy -+#| msgid "" -+#| "Example: GID_MIN=100 GID_MIN=100  " - "GID_MAX=499" - msgstr "" --"Exemple :  GID_MIN=10  " -+"Exemple : GID_MIN=10 " - "GID_MAX=499" - - #: groupadd.8.xml:150(para) -+#, fuzzy -+#| msgid "" -+#| "Note: GID_MIN=10,GID_MAX=499 doesn't work yet." - msgid "" - "Note:  GID_MIN=10,GID_MAX=499 doesn't work yet." - msgstr "" --"Remarque :  GID_MIN-K GID_MIN=10,GID_MAX=499 ne fonctionne pas pour l'instant." - -@@ -9138,11 +9268,11 @@ - - #: gpasswd.1.xml:44(firstname) - msgid "Rafal" --msgstr "" -+msgstr "Rafal" - - #: gpasswd.1.xml:45(surname) - msgid "Maszkowski" --msgstr "" -+msgstr "Maszkowski" - - #: gpasswd.1.xml:71(phrase) - msgid "administer " -@@ -9235,11 +9365,14 @@ - "Les options disponibles pour la commande gpasswd sont :" - - #: gpasswd.1.xml:147(term) -+#, fuzzy -+#| msgid "" -+#| ", user" - msgid "" - ",  user" - msgstr "" --",  utilisateur-a, utilisateur" - - #: gpasswd.1.xml:151(para) -@@ -9251,12 +9384,16 @@ - "replaceable>." - - #: gpasswd.1.xml:160(term) -+#, fuzzy -+#| msgid "" -+#| ", user" - msgid "" - ",  user" - msgstr "" --",  " --"utilisateur" -+", utilisateur" - - #: gpasswd.1.xml:164(para) - msgid "" -@@ -9267,11 +9404,15 @@ - "replaceable>." - - #: gpasswd.1.xml:181(term) -+#, fuzzy -+#| msgid "" -+#| ", CHROOT_DIR" - msgid "" - ",  CHROOT_DIR" - msgstr "" --",  RÉP_CHROOT-Q, RÉP_CHROOT" - - #: gpasswd.1.xml:195(term) -@@ -9306,11 +9447,15 @@ - "replaceable>." - - #: gpasswd.1.xml:227(term) -+#, fuzzy -+#| msgid "" -+#| ", user,..." - msgid "" - ",  " - "user,..." - msgstr "" --",  " -+", " - "utilisateur,..." - - #: gpasswd.1.xml:231(para) -@@ -9318,12 +9463,16 @@ - msgstr "Configurer la liste des administrateurs." - - #: gpasswd.1.xml:239(term) -+#, fuzzy -+#| msgid "" -+#| ", user,..." - msgid "" - ",  user,..." - msgstr "" --",  " --"utilisateur,..." -+", utilisateur,..." - - #: gpasswd.1.xml:243(para) - msgid "Set the list of group members." -@@ -9439,11 +9588,15 @@ - "d'utilisateurs." - - #: faillog.8.xml:128(term) -+#, fuzzy -+#| msgid "" -+#| ", SEC" - msgid "" - ",  SEC" - msgstr "" --",  SEC-l, SEC" - - # NOTE: s/to/during/ -@@ -9463,11 +9616,15 @@ - "pour cette option." - - #: faillog.8.xml:143(term) -+#, fuzzy -+#| msgid "" -+#| ", MAX" - msgid "" - ",  MAX" - msgstr "" --",  MAX-m, MAX" - - #: faillog.8.xml:147(para) -@@ -9618,7 +9775,7 @@ - #: expiry.1.xml:45(contrib) chsh.1.xml:44(contrib) chfn.1.xml:44(contrib) - #: chage.1.xml:42(contrib) - msgid "Creation, 1990" --msgstr "" -+msgstr "Création, 1990" - - #: expiry.1.xml:61(refentrytitle) expiry.1.xml:68(refname) - #: expiry.1.xml:74(command) -@@ -9845,12 +10002,16 @@ - "Les options disponibles pour la commande chpasswd sont :" - - #: chpasswd.8.xml:137(term) -+#, fuzzy -+#| msgid "" -+#| ", METHOD" - msgid "" - ",  " - "METHOD" - msgstr "" --",  " --"MÉTHODE" -+", MÉTHODE" - - #: chpasswd.8.xml:142(para) chgpasswd.8.xml:115(para) - msgid "The available methods are DES, MD5, and NONE." -@@ -9893,11 +10054,15 @@ - "passe fournis ne sont pas chiffrés." - - #: chpasswd.8.xml:200(term) -+#, fuzzy -+#| msgid "" -+#| ", ROUNDS" - msgid "" - ",  ROUNDS" - msgstr "" --",  ROUNDS-s, ROUNDS" - - #: chpasswd.8.xml:219(para) -@@ -9944,7 +10109,7 @@ - - #: chgpasswd.8.xml:47(contrib) - msgid "Creation, 2006" --msgstr "" -+msgstr "Création, 2006" - - #: chgpasswd.8.xml:65(refpurpose) - msgid "update group passwords in batch mode" -@@ -10059,36 +10224,47 @@ - msgstr "Les options applicables à la commande chfn sont :" - - #: chfn.1.xml:117(term) -+#, fuzzy -+#| msgid "" -+#| ", FULL_NAME" - msgid "" - ",  " - "FULL_NAME" - msgstr "" --",  " --"NOM_COMPLET" -+", NOM_COMPLET" - - #: chfn.1.xml:121(para) - msgid "Change the user's full name." - msgstr "Modifier le nom complet de l'utilisateur." - - #: chfn.1.xml:125(term) -+#, fuzzy -+#| msgid "" -+#| ", ,  " - "HOME_PHONE" - msgstr "" --",  " --"TEL_PERSO" -+", TEL_PERSO" - - #: chfn.1.xml:129(para) - msgid "Change the user's home phone number." - msgstr "Modifier le numéro de téléphone personnel de l'utilisateur." - - #: chfn.1.xml:133(term) -+#, fuzzy -+#| msgid "" -+#| ", OTHER" - msgid "" - ",  OTHER" - msgstr "" --",  AUTRE" -+", AUTRE" - - #: chfn.1.xml:137(para) - msgid "" -@@ -10101,12 +10277,16 @@ - "applications et peut être changé seulement par un superutilisateur." - - #: chfn.1.xml:145(term) -+#, fuzzy -+#| msgid "" -+#| ", ROOM_NUMBER" - msgid "" - ",  ROOM_NUMBER" - msgstr "" --",  " --"NUMÉRO_DE_BUREAU" -+", NUMÉRO_DE_BUREAU" - - #: chfn.1.xml:149(para) - msgid "Change the user's room number." -@@ -10117,12 +10297,16 @@ - msgstr ", " - - #: chfn.1.xml:173(term) -+#, fuzzy -+#| msgid "" -+#| ", ,  " - "WORK_PHONE" - msgstr "" --",  " --"TEL_PRO" -+", TEL_PRO" - - #: chfn.1.xml:177(para) - msgid "Change the user's office phone number." -@@ -10180,12 +10364,16 @@ - "Les options disponibles pour la commande chage sont :" - - #: chage.1.xml:97(term) -+#, fuzzy -+#| msgid "" -+#| ", LAST_DAY" - msgid "" - ",  LAST_DAY" - msgstr "" --",  " --"DERNIER_JOUR" -+", DERNIER_JOUR" - - #: chage.1.xml:101(para) - msgid "" -@@ -10199,11 +10387,15 @@ - "région)." - - #: chage.1.xml:109(term) -+#, fuzzy -+#| msgid "" -+#| ", ,  " - "EXPIRE_DATE" - msgstr "" --",  " -+", " - "DATE_FIN_VALIDITÉ" - - # NOTE: s/date// -@@ -10233,11 +10425,15 @@ - "date de fin de validité." - - #: chage.1.xml:135(term) -+#, fuzzy -+#| msgid "" -+#| ", INACTIVE" - msgid "" - ",  INACTIVE" - msgstr "" --",  " -+", " - "DURÉE_INACTIVITÉ" - - #: chage.1.xml:139(para) -@@ -10267,19 +10463,27 @@ - msgstr "Afficher les informations sur l'âge des comptes." - - #: chage.1.xml:164(term) -+#, fuzzy -+#| msgid "" -+#| ", MIN_DAYS" - msgid "" - ",  MIN_DAYS" - msgstr "" --",  JOURS_MIN-m, JOURS_MIN" - - #: chage.1.xml:176(term) -+#, fuzzy -+#| msgid "" -+#| ", MAX_DAYS" - msgid "" - ",  MAX_DAYS" - msgstr "" --",  JOURS_MAX-M, JOURS_MAX" - - #: chage.1.xml:180(para) -@@ -10309,11 +10513,15 @@ - "JOURS_MAX supprime la vérification de validité." - - #: chage.1.xml:209(term) -+#, fuzzy -+#| msgid "" -+#| ", WARN_DAYS" - msgid "" - ",  " - "WARN_DAYS" - msgstr "" --",  " -+", " - "DURÉE_AVERTISSEMENT" - - #: chage.1.xml:213(para) -@@ -10419,6 +10627,12 @@ - #~ "manvolnum>, usermod8." - -+#~ msgid "Kłoczko" -+#~ msgstr "Kłoczko" -+ -+#~ msgid "François" -+#~ msgstr "François" -+ - #~ msgid "" - #~ "login.defs5, passwd" - - #~ msgid "" --#~ "Note:  UID_MIN-K UID_MIN=10,UID_MAX=499 doesn't work yet." - #~ msgstr "" --#~ "Note :  UID_MIN-K UID_MIN=10,UID_MAX=499 ne fonctionne pas pour " - #~ "l'instant." -Index: git/po/fr.po -=================================================================== ---- git.orig/po/fr.po -+++ git/po/fr.po -@@ -1,19 +1,19 @@ - # Translation of shadow messages to French - # Copyright (C) 1999, 2004, 2005, 2006, 2009 Free Software Foundation, Inc. --# Copyright (C) 2011, 2012 Debian French l10n team -+# Copyright (C) 2011-2013 Debian French l10n team - # Patches, suggestions, etc welcome. - # - # Vincent Renardias , 1999, 2005. - # Jean-Luc Coulon , 2005, 2006, 2008. - # Christian Perrier , 2005, 2006, 2008, 2009. - # Jean-Luc Coulon (f5ibh) , 2009. --# Thomas Blein , 2011, 2012. -+# Thomas Blein , 2011, 2012, 2013. - msgid "" - msgstr "" - "Project-Id-Version: shadow\n" - "Report-Msgid-Bugs-To: pkg-shadow-devel@lists.alioth.debian.org\n" - "POT-Creation-Date: 2012-05-20 19:52+0200\n" --"PO-Revision-Date: 2012-01-13 17:09+0100\n" -+"PO-Revision-Date: 2013-07-10 18:53+0200\n" - "Last-Translator: Thomas Blein \n" - "Language-Team: French \n" - "Language: fr\n" -@@ -21,7 +21,7 @@ - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=2; plural=n>1;\n" --"X-Generator: Lokalize 1.0\n" -+"X-Generator: Lokalize 1.4\n" - - #, c-format - msgid "" -@@ -54,10 +54,9 @@ - msgid "%s: nscd did not terminate normally (signal %d)\n" - msgstr "%s : nscd ne s'est pas terminé normalement (signal %d).\n" - --#, fuzzy, c-format --#| msgid "%s: nscd exited with status %d" -+#, c-format - msgid "%s: nscd exited with status %d\n" --msgstr "%s : nscd s'est terminé avec le statut %d." -+msgstr "%s : nscd s'est terminé avec l'état %d\n" - - msgid "Password: " - msgstr "Mot de passe : " -@@ -2022,10 +2021,9 @@ - msgid "%s: line too long in %s: %s..." - msgstr "%s : ligne trop longue dans %s : %s…" - --#, fuzzy, c-format --#| msgid "%s: Cannot create symbolic link %s: %s\n" -+#, c-format - msgid "%s: Cannot create backup file (%s): %s\n" --msgstr "%s : impossible de créer le lien symbolique %s : %s\n" -+msgstr "%s : impossible de créer le fichier de sauvegarde (%s) : %s\n" - - #, c-format - msgid "%s: rename: %s: %s\n" diff --git a/debian/patches/1012_german_translation b/debian/patches/1012_german_translation deleted file mode 100644 index 4ad0f5f7..00000000 --- a/debian/patches/1012_german_translation +++ /dev/null @@ -1,31 +0,0 @@ -Index: git/man/po/de.po -=================================================================== ---- git.orig/man/po/de.po -+++ git/man/po/de.po -@@ -3064,7 +3064,7 @@ - #: 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" -@@ -4315,7 +4315,7 @@ - - #: 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 "" -@@ -6884,7 +6884,7 @@ - "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." - diff --git a/debian/patches/1020_fix-typo-manpage b/debian/patches/1020_fix-typo-manpage deleted file mode 100644 index 3b2af53e..00000000 --- a/debian/patches/1020_fix-typo-manpage +++ /dev/null @@ -1,13 +0,0 @@ -Index: git/man/su.1.xml -=================================================================== ---- git.orig/man/su.1.xml -+++ git/man/su.1.xml -@@ -157,7 +157,7 @@ - - - The executed command will have no controlling terminal. This -- option cannot be used to execute interractive programs which -+ option cannot be used to execute interactive programs which - need a controlling TTY. - diff --git a/debian/patches/userns/01_userns_doc b/debian/patches/userns/01_userns_doc deleted file mode 100644 index f5f5241a..00000000 --- a/debian/patches/userns/01_userns_doc +++ /dev/null @@ -1,334 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:14:18 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id DAC33C80F4; Tue, 22 Jan 2013 09:14:18 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 274ACC80D1 - for ; Tue, 22 Jan 2013 09:14:14 +0000 (UTC) -Received: from out01.mta.xmission.com ([166.70.13.231]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZuB-0006Xm-N5; Tue, 22 Jan 2013 02:12:31 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out01.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZuA-0005NR-BQ; Tue, 22 Jan 2013 02:12:30 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZu7-0004Pj-Ec; Tue, 22 Jan 2013 02:12:30 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:12:23 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <877gn5shs8.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX18YouPWtKNAX3LovSW2+p/ONbuCHMFEQpM= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 01/11] Documentation for /etc/subuid and /etc/subgid -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2071 -Status: RO -Content-Length: 9835 -Lines: 286 - - -Signed-off-by: "Eric W. Biederman" ---- - man/Makefile.am | 4 ++ - man/subgid.5.xml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - man/subuid.5.xml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 244 insertions(+), 0 deletions(-) - create mode 100644 man/subgid.5.xml - create mode 100644 man/subuid.5.xml - -Index: shadow/man/Makefile.am -=================================================================== ---- shadow.orig/man/Makefile.am 2013-02-01 15:26:14.428082026 -0600 -+++ shadow/man/Makefile.am 2013-02-01 15:27:37.000000000 -0600 -@@ -43,6 +43,8 @@ - man5/shadow.5 \ - man1/su.1 \ - man5/suauth.5 \ -+ man5/subgid.5 \ -+ man5/subuid.5 \ - man8/useradd.8 \ - man8/userdel.8 \ - man8/usermod.8 \ -@@ -94,6 +96,8 @@ - sg.1.xml \ - su.1.xml \ - suauth.5.xml \ -+ subgid.5.xml \ -+ subuid.5.xml \ - useradd.8.xml \ - userdel.8.xml \ - usermod.8.xml \ -Index: shadow/man/subgid.5.xml -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/man/subgid.5.xml 2013-02-01 15:26:14.424082026 -0600 -@@ -0,0 +1,120 @@ -+ -+ -+ -+]> -+ -+ -+ subgid -+ 5 -+ File Formats and Conversions -+ shadow-utils -+ &SHADOW_UTILS_VERSION; -+ -+ -+ subgid -+ the subordinate gid file -+ -+ -+ -+ DESCRIPTION -+ -+ Each line in /etc/subgid contains -+ a user id and a range of suboridinate user ids that user -+ is allowed to use. -+ -+ This is specified with three fields delimited by colons -+ (:). -+ These fields are: -+ -+ -+ -+ login name -+ -+ -+ numerical subordinate user ID -+ -+ -+ numerical subordinate user ID count -+ -+ -+ -+ -+ This file specifies the group IDs to be that each user may use -+ with the newgidmap command that ordinary users can use to -+ configure gid mapping in a user namespace. -+ -+ -+ -+ Multiple ranges may be specified per user ID. -+ -+ -+ -+ -+ -+ FILES -+ -+ -+ /etc/subgid -+ -+ Per user subordinate group IDs. -+ -+ -+ -+ /etc/subgid- -+ -+ Backup file for /etc/subgid. -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ subuid5 -+ , -+ -+ logindefs5 -+ , -+ -+ newuidmap1 -+ , -+ -+ newgidmap1 -+ , -+ -+ usermod8 -+ , -+ -+ -+ -Index: shadow/man/subuid.5.xml -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/man/subuid.5.xml 2013-02-01 15:26:14.424082026 -0600 -@@ -0,0 +1,120 @@ -+ -+ -+ -+]> -+ -+ -+ subuid -+ 5 -+ File Formats and Conversions -+ shadow-utils -+ &SHADOW_UTILS_VERSION; -+ -+ -+ subuid -+ the subordinate uid file -+ -+ -+ -+ DESCRIPTION -+ -+ Each line in /etc/subuid contains -+ a user id and a range of suboridinate user ids that user -+ is allowed to use. -+ -+ This is specified with three fields delimited by colons -+ (:). -+ These fields are: -+ -+ -+ -+ login name -+ -+ -+ numerical subordinate user ID -+ -+ -+ numerical subordinate user ID count -+ -+ -+ -+ -+ This file specifies the user IDs to be that each user may use -+ with the newuidmap command that ordinary users can use to -+ configure uid mapping in a user namespace. -+ -+ -+ -+ Multiple ranges may be specified per user ID. -+ -+ -+ -+ -+ -+ FILES -+ -+ -+ /etc/subuid -+ -+ Per user subordinate user IDs. -+ -+ -+ -+ /etc/subuid- -+ -+ Backup file for /etc/subuid. -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ subgid5 -+ , -+ -+ logindefs5 -+ , -+ -+ newuidmap1 -+ , -+ -+ newgidmap1 -+ , -+ -+ usermod8 -+ , -+ -+ -+ diff --git a/debian/patches/userns/02_userns_doc_login.defs b/debian/patches/userns/02_userns_doc_login.defs deleted file mode 100644 index 5d85cce0..00000000 --- a/debian/patches/userns/02_userns_doc_login.defs +++ /dev/null @@ -1,218 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:14:55 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id 140DBC80F4; Tue, 22 Jan 2013 09:14:55 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 5D815C80D1 - for ; Tue, 22 Jan 2013 09:14:50 +0000 (UTC) -Received: from out03.mta.xmission.com ([166.70.13.233]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZum-0006il-0f; Tue, 22 Jan 2013 02:13:08 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZul-0004GF-Id; Tue, 22 Jan 2013 02:13:07 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZuf-0004T0-MS; Tue, 22 Jan 2013 02:13:07 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:12:58 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <871uddshr9.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX19iYyOCEx6dl2v1Ya/KIGpixG5+3MVA1bY= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 02/11] login.defs.5: Document the new variables in login.defs -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2072 -Status: RO -Content-Length: 7615 -Lines: 170 - - -Signed-off-by: "Eric W. Biederman" ---- - man/Makefile.am | 2 + - man/login.defs.5.xml | 8 ++++++ - man/login.defs.d/SUB_GID_COUNT.xml | 46 ++++++++++++++++++++++++++++++++++++ - man/login.defs.d/SUB_UID_COUNT.xml | 46 ++++++++++++++++++++++++++++++++++++ - 4 files changed, 102 insertions(+), 0 deletions(-) - create mode 100644 man/login.defs.d/SUB_GID_COUNT.xml - create mode 100644 man/login.defs.d/SUB_UID_COUNT.xml - -Index: shadow/man/Makefile.am -=================================================================== ---- shadow.orig/man/Makefile.am 2013-02-01 15:27:51.048080390 -0600 -+++ shadow/man/Makefile.am 2013-02-01 15:27:51.040080390 -0600 -@@ -163,6 +163,8 @@ - USERDEL_CMD.xml \ - USERGROUPS_ENAB.xml \ - USE_TCB.xml \ -+ SUB_GID_COUNT.xml \ -+ SUB_UID_COUNT.xml \ - SYS_GID_MAX.xml \ - SYS_UID_MAX.xml - -Index: shadow/man/login.defs.5.xml -=================================================================== ---- shadow.orig/man/login.defs.5.xml 2013-02-01 15:27:51.048080390 -0600 -+++ shadow/man/login.defs.5.xml 2013-02-01 15:27:51.044080390 -0600 -@@ -78,6 +78,8 @@ - - - -+ -+ - - - -@@ -216,6 +218,8 @@ - &SULOG_FILE; - &SU_NAME; - &SU_WHEEL_ONLY; -+ &SUB_GID_COUNT; -+ &SUB_UID_COUNT; - &SYS_GID_MAX; - &SYS_UID_MAX; - &SYSLOG_SG_ENAB; -@@ -393,6 +397,8 @@ - PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE - SHA_CRYPT_MAX_ROUNDS - SHA_CRYPT_MIN_ROUNDS -+ SUB_GID_COUNT SUB_GID_MAX SUB_GID_MIN -+ SUB_UID_COUNT SUB_UID_MAX SUB_UID_MIN - SYS_GID_MAX SYS_GID_MIN SYS_UID_MAX SYS_UID_MIN UID_MAX UID_MIN - UMASK - -@@ -470,6 +476,8 @@ - GID_MAX GID_MIN - MAIL_DIR MAX_MEMBERS_PER_GROUP - PASS_MAX_DAYS PASS_MIN_DAYS PASS_WARN_AGE -+ SUB_GID_COUNT SUB_GID_MAX SUB_GID_MIN -+ SUB_UID_COUNT SUB_UID_MAX SUB_UID_MIN - SYS_GID_MAX SYS_GID_MIN SYS_UID_MAX SYS_UID_MIN UID_MAX UID_MIN - UMASK - TCB_AUTH_GROUP TCB_SYMLINK USE_TCB -Index: shadow/man/login.defs.d/SUB_GID_COUNT.xml -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/man/login.defs.d/SUB_GID_COUNT.xml 2013-02-01 15:27:51.044080390 -0600 -@@ -0,0 +1,46 @@ -+ -+ -+ (number) -+ (number) -+ (number) -+ -+ -+ The commands useradd and newusers -+ allocate unused group IDs from the range -+ to for each -+ new user. -+ -+ -+ The default values for , -+ , -+ are respectively 100000, 600100000 and 10000. -+ -+ -+ -Index: shadow/man/login.defs.d/SUB_UID_COUNT.xml -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/man/login.defs.d/SUB_UID_COUNT.xml 2013-02-01 15:27:51.044080390 -0600 -@@ -0,0 +1,46 @@ -+ -+ -+ (number) -+ (number) -+ (number) -+ -+ -+ The commands useradd and newusers -+ allocate unused user IDs from the range -+ to for each -+ new user. -+ -+ -+ The default values for , -+ , -+ are respectively 100000, 600100000 and 10000. -+ -+ -+ diff --git a/debian/patches/userns/03_userns_implement_commonio_append b/debian/patches/userns/03_userns_implement_commonio_append deleted file mode 100644 index b85d0123..00000000 --- a/debian/patches/userns/03_userns_implement_commonio_append +++ /dev/null @@ -1,110 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:15:19 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id CAFA8C80F6; Tue, 22 Jan 2013 09:15:19 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 43FAEC80D1 - for ; Tue, 22 Jan 2013 09:15:15 +0000 (UTC) -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZvA-0006sA-Pq; Tue, 22 Jan 2013 02:13:32 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZv8-0004VI-Fi; Tue, 22 Jan 2013 02:13:32 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:13:26 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87vcapr361.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1++0A/mQBimfZkeNedO095IfnCYGQfIolI= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 03/11] Implement commonio_append. -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2073 -Status: RO -Content-Length: 1874 -Lines: 65 - - -To support files that do not have a simple unique key implement -commonio_append to allow new entries to be added. - -Signed-off-by: "Eric W. Biederman" ---- - lib/commonio.c | 30 ++++++++++++++++++++++++++++++ - lib/commonio.h | 1 + - 2 files changed, 31 insertions(+), 0 deletions(-) - -Index: shadow/lib/commonio.c -=================================================================== ---- shadow.orig/lib/commonio.c 2013-02-01 15:27:51.376080384 -0600 -+++ shadow/lib/commonio.c 2013-02-01 15:27:51.368080384 -0600 -@@ -1121,6 +1121,36 @@ - return 1; - } - -+int commonio_append (struct commonio_db *db, const void *eptr) -+{ -+ struct commonio_entry *p; -+ void *nentry; -+ -+ if (!db->isopen || db->readonly) { -+ errno = EINVAL; -+ return 0; -+ } -+ nentry = db->ops->dup (eptr); -+ if (NULL == nentry) { -+ errno = ENOMEM; -+ return 0; -+ } -+ /* new entry */ -+ p = (struct commonio_entry *) malloc (sizeof *p); -+ if (NULL == p) { -+ db->ops->free (nentry); -+ errno = ENOMEM; -+ return 0; -+ } -+ -+ p->eptr = nentry; -+ p->line = NULL; -+ p->changed = true; -+ add_one_entry (db, p); -+ -+ db->changed = true; -+ return 1; -+} - - void commonio_del_entry (struct commonio_db *db, const struct commonio_entry *p) - { -Index: shadow/lib/commonio.h -=================================================================== ---- shadow.orig/lib/commonio.h 2013-02-01 15:27:51.376080384 -0600 -+++ shadow/lib/commonio.h 2013-02-01 15:27:51.368080384 -0600 -@@ -146,6 +146,7 @@ - extern int commonio_open (struct commonio_db *, int); - extern /*@observer@*/ /*@null@*/const void *commonio_locate (struct commonio_db *, const char *); - extern int commonio_update (struct commonio_db *, const void *); -+extern int commonio_append (struct commonio_db *, const void *); - extern int commonio_remove (struct commonio_db *, const char *); - extern int commonio_rewind (struct commonio_db *); - extern /*@observer@*/ /*@null@*/const void *commonio_next (struct commonio_db *); diff --git a/debian/patches/userns/04_userns_add_backend_support b/debian/patches/userns/04_userns_add_backend_support deleted file mode 100644 index 187b9b8c..00000000 --- a/debian/patches/userns/04_userns_add_backend_support +++ /dev/null @@ -1,685 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:16:29 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id AF9A9C80F4; Tue, 22 Jan 2013 09:16:29 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id EDF70C80D1 - for ; Tue, 22 Jan 2013 09:16:24 +0000 (UTC) -Received: from out01.mta.xmission.com ([166.70.13.231]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZwI-0007HS-Mn; Tue, 22 Jan 2013 02:14:42 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out01.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZwI-0005wP-8E; Tue, 22 Jan 2013 02:14:42 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZwE-0004bA-Mv; Tue, 22 Jan 2013 02:14:42 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:14:35 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87liblr344.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1/3QOlmT6VsAuzQbs/RJ/nb1IrpO++QYVA= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 04/11] Add backend support for suboridnate uids and gids -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2074 -Status: RO -X-Status: A -Content-Length: 15967 -Lines: 636 - - -These files list the set of subordinate uids and gids that users are allowed -to use. The expect use case is with the user namespace but other uses are -allowed. - -Signed-off-by: "Eric W. Biederman" ---- - etc/login.defs | 8 + - lib/Makefile.am | 2 + - lib/getdef.c | 6 + - lib/subordinateio.c | 512 +++++++++++++++++++++++++++++++++++++++++++++++++++ - lib/subordinateio.h | 38 ++++ - 5 files changed, 566 insertions(+), 0 deletions(-) - create mode 100644 lib/subordinateio.c - create mode 100644 lib/subordinateio.h - -Index: shadow/etc/login.defs -=================================================================== ---- shadow.orig/etc/login.defs 2013-02-01 15:27:51.684080379 -0600 -+++ shadow/etc/login.defs 2013-02-01 15:27:51.676080379 -0600 -@@ -226,6 +226,10 @@ - # System accounts - SYS_UID_MIN 101 - SYS_UID_MAX 999 -+# Extra per user uids -+SUB_UID_MIN 100000 -+SUB_UID_MAX 600100000 -+SUB_UID_COUNT 10000 - - # - # Min/max values for automatic gid selection in groupadd -@@ -235,6 +239,10 @@ - # System accounts - SYS_GID_MIN 101 - SYS_GID_MAX 999 -+# Extra per user group ids -+SUB_GID_MIN 100000 -+SUB_GID_MAX 600100000 -+SUB_GID_COUNT 10000 - - # - # Max number of login retries if password is bad -Index: shadow/lib/Makefile.am -=================================================================== ---- shadow.orig/lib/Makefile.am 2013-02-01 15:27:51.684080379 -0600 -+++ shadow/lib/Makefile.am 2013-02-01 15:27:51.676080379 -0600 -@@ -39,6 +39,8 @@ - pwio.c \ - pwio.h \ - pwmem.c \ -+ subordinateio.h \ -+ subordinateio.c \ - selinux.c \ - semanage.c \ - sgetgrent.c \ -Index: shadow/lib/getdef.c -=================================================================== ---- shadow.orig/lib/getdef.c 2013-02-01 15:27:51.684080379 -0600 -+++ shadow/lib/getdef.c 2013-02-01 15:27:51.680080379 -0600 -@@ -82,6 +82,12 @@ - {"SHA_CRYPT_MAX_ROUNDS", NULL}, - {"SHA_CRYPT_MIN_ROUNDS", NULL}, - #endif -+ {"SUB_GID_COUNT", NULL}, -+ {"SUB_GID_MAX", NULL}, -+ {"SUB_GID_MIN", NULL}, -+ {"SUB_UID_COUNT", NULL}, -+ {"SUB_UID_MAX", NULL}, -+ {"SUB_UID_MIN", NULL}, - {"SULOG_FILE", NULL}, - {"SU_NAME", NULL}, - {"SYS_GID_MAX", NULL}, -Index: shadow/lib/subordinateio.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/lib/subordinateio.c 2013-02-01 15:27:51.680080379 -0600 -@@ -0,0 +1,512 @@ -+/* -+ * Copyright (c) 2012 - Eric Biederman -+ */ -+ -+#include -+#include "prototypes.h" -+#include "defines.h" -+#include -+#include "commonio.h" -+#include "subordinateio.h" -+ -+struct subordinate_range { -+ const char *owner; -+ unsigned long start; -+ unsigned long count; -+}; -+ -+#define NFIELDS 3 -+ -+static /*@null@*/ /*@only@*/void *subordinate_dup (const void *ent) -+{ -+ const struct subordinate_range *rangeent = ent; -+ struct subordinate_range *range; -+ -+ range = (struct subordinate_range *) malloc (sizeof *range); -+ if (NULL == range) { -+ return NULL; -+ } -+ range->owner = strdup (rangeent->owner); -+ if (NULL == range->owner) { -+ free(range); -+ return NULL; -+ } -+ range->start = rangeent->start; -+ range->count = rangeent->count; -+ -+ return range; -+} -+ -+static void subordinate_free (/*@out@*/ /*@only@*/void *ent) -+{ -+ struct subordinate_range *rangeent = ent; -+ -+ free ((void *)(rangeent->owner)); -+ free (rangeent); -+} -+ -+static void *subordinate_parse (const char *line) -+{ -+ static struct subordinate_range range; -+ char rangebuf[1024]; -+ int i; -+ char *cp; -+ char *fields[NFIELDS]; -+ -+ /* -+ * Copy the string to a temporary buffer so the substrings can -+ * be modified to be NULL terminated. -+ */ -+ if (strlen (line) >= sizeof rangebuf) -+ return NULL; /* fail if too long */ -+ strcpy (rangebuf, line); -+ -+ /* -+ * Save a pointer to the start of each colon separated -+ * field. The fields are converted into NUL terminated strings. -+ */ -+ -+ for (cp = rangebuf, i = 0; (i < NFIELDS) && (NULL != cp); i++) { -+ fields[i] = cp; -+ while (('\0' != *cp) && (':' != *cp)) { -+ cp++; -+ } -+ -+ if ('\0' != *cp) { -+ *cp = '\0'; -+ cp++; -+ } else { -+ cp = NULL; -+ } -+ } -+ -+ /* -+ * There must be exactly NFIELDS colon separated fields or -+ * the entry is invalid. Also, fields must be non-blank. -+ */ -+ if (i != NFIELDS || *fields[0] == '\0' || *fields[1] == '\0' || *fields[2] == '\0') -+ return NULL; -+ range.owner = fields[0]; -+ if (getulong (fields[1], &range.start) == 0) -+ return NULL; -+ if (getulong (fields[2], &range.count) == 0) -+ return NULL; -+ -+ return ⦥ -+} -+ -+static int subordinate_put (const void *ent, FILE * file) -+{ -+ const struct subordinate_range *range = ent; -+ -+ return fprintf(file, "%s:%lu:%lu\n", -+ range->owner, -+ range->start, -+ range->count) < 0 ? -1 : 0; -+} -+ -+static struct commonio_ops subordinate_ops = { -+ subordinate_dup, /* dup */ -+ subordinate_free, /* free */ -+ NULL, /* getname */ -+ subordinate_parse, /* parse */ -+ subordinate_put, /* put */ -+ fgets, /* fgets */ -+ fputs, /* fputs */ -+ NULL, /* open_hook */ -+ NULL, /* close_hook */ -+}; -+ -+static /*@observer@*/ /*@null*/const struct subordinate_range *subordinate_next(struct commonio_db *db) -+{ -+ commonio_next (db); -+} -+ -+static bool is_range_free(struct commonio_db *db, unsigned long start, -+ unsigned long count) -+{ -+ const struct subordinate_range *range; -+ unsigned long end = start + count - 1; -+ -+ commonio_rewind(db); -+ while ((range = commonio_next(db)) != NULL) { -+ unsigned long first = range->start; -+ unsigned long last = first + range->count - 1; -+ -+ if ((end >= first) && (start <= last)) -+ return false; -+ } -+ return true; -+} -+ -+static const bool range_exists(struct commonio_db *db, const char *owner) -+{ -+ const struct subordinate_range *range; -+ commonio_rewind(db); -+ while ((range = commonio_next(db)) != NULL) { -+ unsigned long first = range->start; -+ unsigned long last = first + range->count - 1; -+ -+ if (0 == strcmp(range->owner, owner)) -+ return true; -+ } -+ return false; -+} -+ -+static const struct subordinate_range *find_range(struct commonio_db *db, -+ const char *owner, unsigned long val) -+{ -+ const struct subordinate_range *range; -+ commonio_rewind(db); -+ while ((range = commonio_next(db)) != NULL) { -+ unsigned long first = range->start; -+ unsigned long last = first + range->count - 1; -+ -+ if (0 != strcmp(range->owner, owner)) -+ continue; -+ -+ if ((val >= first) && (val <= last)) -+ return range; -+ } -+ return NULL; -+} -+ -+static bool have_range(struct commonio_db *db, -+ const char *owner, unsigned long start, unsigned long count) -+{ -+ const struct subordinate_range *range; -+ unsigned long end; -+ -+ if (count == 0) -+ return false; -+ -+ end = start + count - 1; -+ range = find_range (db, owner, start); -+ while (range) { -+ unsigned long last; -+ -+ last = range->start + range->count - 1; -+ if (last >= (start + count - 1)) -+ return true; -+ -+ count = end - last; -+ start = last + 1; -+ range = find_range(db, owner, start); -+ } -+ return false; -+} -+ -+static int subordinate_range_cmp (const void *p1, const void *p2) -+{ -+ struct subordinate_range *range1, *range2; -+ -+ if ((*(struct commonio_entry **) p1)->eptr == NULL) -+ return 1; -+ if ((*(struct commonio_entry **) p2)->eptr == NULL) -+ return -1; -+ -+ range1 = ((struct subordinate_range *) (*(struct commonio_entry **) p1)->eptr); -+ range2 = ((struct subordinate_range *) (*(struct commonio_entry **) p2)->eptr); -+ -+ if (range1->start < range2->start) -+ return -1; -+ else if (range1->start > range2->start) -+ return 1; -+ else if (range1->count < range2->count) -+ return -1; -+ else if (range1->count > range2->count) -+ return 1; -+ else -+ return strcmp(range1->owner, range2->owner); -+} -+ -+static unsigned long find_free_range(struct commonio_db *db, -+ unsigned long min, unsigned long max, -+ unsigned long count) -+{ -+ const struct subordinate_range *range; -+ unsigned long low, high; -+ -+ /* When given invalid parameters fail */ -+ if ((count == 0) || (max <= min)) -+ goto fail; -+ -+ /* Sort by range than by owner */ -+ commonio_sort (db, subordinate_range_cmp); -+ commonio_rewind(db); -+ -+ low = min; -+ while ((range = commonio_next(db)) != NULL) { -+ unsigned long first = range->start; -+ unsigned long last = first + range->count - 1; -+ -+ /* Find the top end of the hole before this range */ -+ high = first; -+ if (high > max) -+ high = max; -+ -+ /* Is the hole before this range large enough? */ -+ if ((high > low) && (((high - low) + 1) >= count)) -+ return low; -+ -+ /* Compute the low end of the next hole */ -+ if (low < (last + 1)) -+ low = last + 1; -+ if (low > max) -+ goto fail; -+ } -+ -+ /* Is the remaining unclaimed area large enough? */ -+ if (((max - low) + 1) >= count) -+ return low; -+fail: -+ return ULONG_MAX; -+} -+ -+static int add_range(struct commonio_db *db, -+ const char *owner, unsigned long start, unsigned long count) -+{ -+ struct subordinate_range range; -+ range.owner = owner; -+ range.start = start; -+ range.count = count; -+ -+ /* See if the range is already present */ -+ if (have_range(db, owner, start, count)) -+ return 1; -+ -+ /* Oterwise append the range */ -+ return commonio_append(db, &range); -+} -+ -+static int remove_range(struct commonio_db *db, -+ const char *owner, unsigned long start, unsigned long count) -+{ -+ struct commonio_entry *ent; -+ unsigned long end; -+ -+ if (count == 0) -+ return 1; -+ -+ end = start + count - 1; -+ for (ent = db->head; ent; ent = ent->next) { -+ struct subordinate_range *range = ent->eptr; -+ unsigned long first; -+ unsigned long last; -+ -+ /* Skip unparsed entries */ -+ if (!range) -+ continue; -+ -+ first = range->start; -+ last = first + range->count - 1; -+ -+ /* Skip entries with a different owner */ -+ if (0 != strcmp(range->owner, owner)) -+ continue; -+ -+ /* Skip entries outside of the range to remove */ -+ if ((end < first) || (start > last)) -+ continue; -+ -+ /* Is entry completely contained in the range to remove? */ -+ if ((start <= first) && (end >= last)) { -+ commonio_del_entry (db, ent); -+ } -+ /* Is just the start of the entry removed? */ -+ else if ((start <= first) && (end < last)) { -+ range->start = end + 1; -+ range->count = (last - range->start) + 1; -+ -+ ent->changed = true; -+ } -+ /* Is just the end of the entry removed? */ -+ else if ((start > first) && (end >= last)) { -+ range->count = (start - range->start) + 1; -+ -+ ent->changed = true; -+ } -+ /* The middle of the range is removed */ -+ else { -+ struct subordinate_range tail; -+ tail.owner = range->owner; -+ tail.start = end + 1; -+ tail.count = (last - tail.start) + 1; -+ -+ if (!commonio_append(db, &tail)) -+ return 0; -+ -+ range->count = (start - range->start) + 1; -+ -+ ent->changed = true; -+ } -+ } -+ -+ return 1; -+} -+ -+static struct commonio_db subordinate_uid_db = { -+ "/etc/subuid", /* filename */ -+ &subordinate_ops, /* ops */ -+ NULL, /* fp */ -+#ifdef WITH_SELINUX -+ NULL, /* scontext */ -+#endif -+ NULL, /* head */ -+ NULL, /* tail */ -+ NULL, /* cursor */ -+ false, /* changed */ -+ false, /* isopen */ -+ false, /* locked */ -+ false /* readonly */ -+}; -+ -+int sub_uid_setdbname (const char *filename) -+{ -+ return commonio_setname (&subordinate_uid_db, filename); -+} -+ -+/*@observer@*/const char *sub_uid_dbname (void) -+{ -+ return subordinate_uid_db.filename; -+} -+ -+bool sub_uid_file_present (void) -+{ -+ return commonio_present (&subordinate_uid_db); -+} -+ -+int sub_uid_lock (void) -+{ -+ return commonio_lock (&subordinate_uid_db); -+} -+ -+int sub_uid_open (int mode) -+{ -+ return commonio_open (&subordinate_uid_db, mode); -+} -+ -+bool is_sub_uid_range_free(uid_t start, unsigned long count) -+{ -+ return is_range_free (&subordinate_uid_db, start, count); -+} -+ -+bool sub_uid_assigned(const char *owner) -+{ -+ return range_exists (&subordinate_uid_db, owner); -+} -+ -+bool have_sub_uids(const char *owner, uid_t start, unsigned long count) -+{ -+ return have_range (&subordinate_uid_db, owner, start, count); -+} -+ -+int sub_uid_add (const char *owner, uid_t start, unsigned long count) -+{ -+ return add_range (&subordinate_uid_db, owner, start, count); -+} -+ -+int sub_uid_remove (const char *owner, uid_t start, unsigned long count) -+{ -+ return remove_range (&subordinate_uid_db, owner, start, count); -+} -+ -+int sub_uid_close (void) -+{ -+ return commonio_close (&subordinate_uid_db); -+} -+ -+int sub_uid_unlock (void) -+{ -+ return commonio_unlock (&subordinate_uid_db); -+} -+ -+uid_t sub_uid_find_free_range(uid_t min, uid_t max, unsigned long count) -+{ -+ unsigned long start; -+ start = find_free_range (&subordinate_uid_db, min, max, count); -+ return start == ULONG_MAX ? (uid_t) -1 : start; -+} -+ -+static struct commonio_db subordinate_gid_db = { -+ "/etc/subgid", /* filename */ -+ &subordinate_ops, /* ops */ -+ NULL, /* fp */ -+#ifdef WITH_SELINUX -+ NULL, /* scontext */ -+#endif -+ NULL, /* head */ -+ NULL, /* tail */ -+ NULL, /* cursor */ -+ false, /* changed */ -+ false, /* isopen */ -+ false, /* locked */ -+ false /* readonly */ -+}; -+ -+int sub_gid_setdbname (const char *filename) -+{ -+ return commonio_setname (&subordinate_gid_db, filename); -+} -+ -+/*@observer@*/const char *sub_gid_dbname (void) -+{ -+ return subordinate_gid_db.filename; -+} -+ -+bool sub_gid_file_present (void) -+{ -+ return commonio_present (&subordinate_gid_db); -+} -+ -+int sub_gid_lock (void) -+{ -+ return commonio_lock (&subordinate_gid_db); -+} -+ -+int sub_gid_open (int mode) -+{ -+ return commonio_open (&subordinate_gid_db, mode); -+} -+ -+bool is_sub_gid_range_free(gid_t start, unsigned long count) -+{ -+ return is_range_free (&subordinate_gid_db, start, count); -+} -+ -+bool have_sub_gids(const char *owner, gid_t start, unsigned long count) -+{ -+ return have_range(&subordinate_gid_db, owner, start, count); -+} -+ -+bool sub_gid_assigned(const char *owner) -+{ -+ return range_exists (&subordinate_gid_db, owner); -+} -+ -+int sub_gid_add (const char *owner, gid_t start, unsigned long count) -+{ -+ return add_range (&subordinate_gid_db, owner, start, count); -+} -+ -+int sub_gid_remove (const char *owner, gid_t start, unsigned long count) -+{ -+ return remove_range (&subordinate_gid_db, owner, start, count); -+} -+ -+int sub_gid_close (void) -+{ -+ return commonio_close (&subordinate_gid_db); -+} -+ -+int sub_gid_unlock (void) -+{ -+ return commonio_unlock (&subordinate_gid_db); -+} -+ -+gid_t sub_gid_find_free_range(gid_t min, gid_t max, unsigned long count) -+{ -+ unsigned long start; -+ start = find_free_range (&subordinate_gid_db, min, max, count); -+ return start == ULONG_MAX ? (gid_t) -1 : start; -+} -Index: shadow/lib/subordinateio.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/lib/subordinateio.h 2013-02-01 15:27:51.680080379 -0600 -@@ -0,0 +1,38 @@ -+/* -+ * Copyright (c) 2012- Eric W. Biederman -+ */ -+ -+#ifndef _SUBORDINATEIO_H -+#define _SUBORDINATEIO_H -+ -+#include -+ -+extern int sub_uid_close(void); -+extern bool is_sub_uid_range_free(uid_t start, unsigned long count); -+extern bool have_sub_uids(const char *owner, uid_t start, unsigned long count); -+extern bool sub_uid_file_present (void); -+extern bool sub_uid_assigned(const char *owner); -+extern int sub_uid_lock (void); -+extern int sub_uid_setdbname (const char *filename); -+extern /*@observer@*/const char *sub_uid_dbname (void); -+extern int sub_uid_open (int mode); -+extern int sub_uid_unlock (void); -+extern int sub_uid_add (const char *owner, uid_t start, unsigned long count); -+extern int sub_uid_remove (const char *owner, uid_t start, unsigned long count); -+extern uid_t sub_uid_find_free_range(uid_t min, uid_t max, unsigned long count); -+ -+extern int sub_gid_close(void); -+extern bool is_sub_gid_range_free(gid_t start, unsigned long count); -+extern bool have_sub_gids(const char *owner, gid_t start, unsigned long count); -+extern bool sub_gid_file_present (void); -+extern bool sub_gid_assigned(const char *owner); -+extern int sub_gid_lock (void); -+extern int sub_gid_setdbname (const char *filename); -+extern /*@observer@*/const char *sub_gid_dbname (void); -+extern int sub_gid_open (int mode); -+extern int sub_gid_unlock (void); -+extern int sub_gid_add (const char *owner, gid_t start, unsigned long count); -+extern int sub_gid_remove (const char *owner, gid_t start, unsigned long count); -+extern uid_t sub_gid_find_free_range(gid_t min, gid_t max, unsigned long count); -+ -+#endif diff --git a/debian/patches/userns/05_userns_implemend_find_new_sub_xids b/debian/patches/userns/05_userns_implemend_find_new_sub_xids deleted file mode 100644 index 707b552b..00000000 --- a/debian/patches/userns/05_userns_implemend_find_new_sub_xids +++ /dev/null @@ -1,283 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:17:02 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id 480ABC80F4; Tue, 22 Jan 2013 09:17:02 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 90ACFC80D1 - for ; Tue, 22 Jan 2013 09:16:57 +0000 (UTC) -Received: from out01.mta.xmission.com ([166.70.13.231]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZwp-0007cg-9X; Tue, 22 Jan 2013 02:15:15 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out01.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZwo-0006DN-OT; Tue, 22 Jan 2013 02:15:14 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZwj-0004g0-9e; Tue, 22 Jan 2013 02:15:14 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:15:05 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87fw1tr33a.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX19KHX5xUOkaLY5iIEqDVLxZKDTByyA0Xk8= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 05/11] Implement find_new_sub_uids find_new_sub_gids -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2075 -Status: RO -Content-Length: 8108 -Lines: 235 - - -Functions for finding new subordinate uid and gids ranges for use -with useradd. - -Signed-off-by: "Eric W. Biederman" ---- - lib/prototypes.h | 9 ++++ - libmisc/Makefile.am | 2 + - libmisc/find_new_sub_gids.c | 87 +++++++++++++++++++++++++++++++++++++++++++ - libmisc/find_new_sub_uids.c | 87 +++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 185 insertions(+), 0 deletions(-) - create mode 100644 libmisc/find_new_sub_gids.c - create mode 100644 libmisc/find_new_sub_uids.c - -Index: shadow/lib/prototypes.h -=================================================================== ---- shadow.orig/lib/prototypes.h 2013-02-01 15:27:52.044080373 -0600 -+++ shadow/lib/prototypes.h 2013-02-01 15:27:52.040080373 -0600 -@@ -149,6 +149,15 @@ - uid_t *uid, - /*@null@*/uid_t const *preferred_uid); - -+/* find_new_sub_gids.c */ -+extern int find_new_sub_gids (const char *owner, -+ gid_t *range_start, unsigned long *range_count); -+ -+/* find_new_sub_uids.c */ -+extern int find_new_sub_uids (const char *owner, -+ uid_t *range_start, unsigned long *range_count); -+ -+ - /* get_gid.c */ - extern int get_gid (const char *gidstr, gid_t *gid); - -Index: shadow/libmisc/Makefile.am -=================================================================== ---- shadow.orig/libmisc/Makefile.am 2013-02-01 15:27:52.044080373 -0600 -+++ shadow/libmisc/Makefile.am 2013-02-01 15:27:52.040080373 -0600 -@@ -25,6 +25,8 @@ - failure.h \ - find_new_gid.c \ - find_new_uid.c \ -+ find_new_sub_gids.c \ -+ find_new_sub_uids.c \ - getdate.h \ - getdate.y \ - getgr_nam_gid.c \ -Index: shadow/libmisc/find_new_sub_gids.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/libmisc/find_new_sub_gids.c 2013-02-01 15:27:52.040080373 -0600 -@@ -0,0 +1,87 @@ -+/* -+ * Copyright (c) 2012 Eric Biederman -+ * -+ * 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 -+ -+#include -+#include -+#include -+ -+#include "prototypes.h" -+#include "subordinateio.h" -+#include "getdef.h" -+ -+/* -+ * find_new_sub_gids - Find a new unused range of GIDs. -+ * -+ * If successful, find_new_sub_gids provides a range of unused -+ * user IDs in the [SUB_GID_MIN:SUB_GID_MAX] range. -+ * -+ * Return 0 on success, -1 if no unused GIDs are available. -+ */ -+int find_new_sub_gids (const char *owner, -+ gid_t *range_start, unsigned long *range_count) -+{ -+ unsigned long min, max; -+ unsigned long count; -+ gid_t start; -+ -+ assert (range_start != NULL); -+ assert (range_count != NULL); -+ -+ min = getdef_ulong ("SUB_GID_MIN", 100000UL); -+ max = getdef_ulong ("SUB_GID_MAX", 600100000UL); -+ count = getdef_ulong ("SUB_GID_COUNT", 10000); -+ -+ /* Is there a preferred range that works? */ -+ if ((*range_count != 0) && -+ (*range_start >= min) && -+ (((*range_start) + (*range_count) - 1) <= max) && -+ is_sub_gid_range_free(*range_start, *range_count)) { -+ return 0; -+ } -+ -+ if (max < (min + count)) { -+ (void) fprintf (stderr, -+ _("%s: Invalid configuration: SUB_GID_MIN (%lu), SUB_GID_MAX (%lu)\n"), -+ Prog, min, max); -+ return -1; -+ } -+ start = sub_gid_find_free_range(min, max, count); -+ if (start == (gid_t)-1) { -+ fprintf (stderr, -+ _("%s: Can't get unique secondary GID range\n"), -+ Prog); -+ SYSLOG ((LOG_WARN, "no more available secondary GIDs on the system")); -+ return -1; -+ } -+ *range_start = start; -+ *range_count = count; -+ return 0; -+} -+ -Index: shadow/libmisc/find_new_sub_uids.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/libmisc/find_new_sub_uids.c 2013-02-01 15:27:52.040080373 -0600 -@@ -0,0 +1,87 @@ -+/* -+ * Copyright (c) 2012 Eric Biederman -+ * -+ * 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 -+ -+#include -+#include -+#include -+ -+#include "prototypes.h" -+#include "subordinateio.h" -+#include "getdef.h" -+ -+/* -+ * find_new_sub_uids - Find a new unused range of UIDs. -+ * -+ * If successful, find_new_sub_uids provides a range of unused -+ * user IDs in the [SUB_UID_MIN:SUB_UID_MAX] range. -+ * -+ * Return 0 on success, -1 if no unused UIDs are available. -+ */ -+int find_new_sub_uids (const char *owner, -+ uid_t *range_start, unsigned long *range_count) -+{ -+ unsigned long min, max; -+ unsigned long count; -+ uid_t start; -+ -+ assert (range_start != NULL); -+ assert (range_count != NULL); -+ -+ min = getdef_ulong ("SUB_UID_MIN", 100000UL); -+ max = getdef_ulong ("SUB_UID_MAX", 600100000UL); -+ count = getdef_ulong ("SUB_UID_COUNT", 10000); -+ -+ /* Is there a preferred range that works? */ -+ if ((*range_count != 0) && -+ (*range_start >= min) && -+ (((*range_start) + (*range_count) - 1) <= max) && -+ is_sub_uid_range_free(*range_start, *range_count)) { -+ return 0; -+ } -+ -+ if (max < (min + count)) { -+ (void) fprintf (stderr, -+ _("%s: Invalid configuration: SUB_UID_MIN (%lu), SUB_UID_MAX (%lu)\n"), -+ Prog, min, max); -+ return -1; -+ } -+ start = sub_uid_find_free_range(min, max, count); -+ if (start == (uid_t)-1) { -+ fprintf (stderr, -+ _("%s: Can't get unique secondary UID range\n"), -+ Prog); -+ SYSLOG ((LOG_WARN, "no more available secondary UIDs on the system")); -+ return -1; -+ } -+ *range_start = start; -+ *range_count = count; -+ return 0; -+} -+ diff --git a/debian/patches/userns/06_userns_userdel b/debian/patches/userns/06_userns_userdel deleted file mode 100644 index 16e7051e..00000000 --- a/debian/patches/userns/06_userns_userdel +++ /dev/null @@ -1,236 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:18:47 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id F2E6AC80F6; Tue, 22 Jan 2013 09:18:46 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 996B1C80D1 - for ; Tue, 22 Jan 2013 09:18:42 +0000 (UTC) -Received: from out03.mta.xmission.com ([166.70.13.233]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZyW-0008Bi-3X; Tue, 22 Jan 2013 02:17:00 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZyU-0005NA-Qm; Tue, 22 Jan 2013 02:16:59 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZyQ-0004qs-T1; Tue, 22 Jan 2013 02:16:58 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:16:51 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <878v7lr30c.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1/1l7dElNy9uNLAXx8eC28OMs/pxPM8NEo= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 06/11] userdel: Add support for removing subordinate user and group ids. -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2076 -Status: O -Content-Length: 5573 -Lines: 186 - - -Signed-off-by: "Eric W. Biederman" ---- - src/userdel.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 115 insertions(+), 0 deletions(-) - -Index: shadow/src/userdel.c -=================================================================== ---- shadow.orig/src/userdel.c 2013-02-01 15:27:52.380080367 -0600 -+++ shadow/src/userdel.c 2013-02-01 15:27:52.372080367 -0600 -@@ -65,6 +65,7 @@ - #endif /* WITH_TCB */ - /*@-exitarg@*/ - #include "exitcodes.h" -+#include "subordinateio.h" - - /* - * exit status values -@@ -75,6 +76,8 @@ - #define E_GRP_UPDATE 10 /* can't update group file */ - #define E_HOMEDIR 12 /* can't remove home directory */ - #define E_SE_UPDATE 14 /* can't update SELinux user mapping */ -+#define E_SUB_UID_UPDATE 16 /* can't update the subordinate uid file */ -+#define E_SUB_GID_UPDATE 18 /* can't update the subordinate gid file */ - - /* - * Global variables -@@ -96,9 +99,13 @@ - static bool is_shadow_grp; - static bool sgr_locked = false; - #endif /* SHADOWGRP */ -+static bool is_sub_uid; -+static bool is_sub_gid; - static bool pw_locked = false; - static bool gr_locked = false; - static bool spw_locked = false; -+static bool sub_uid_locked = false; -+static bool sub_gid_locked = false; - - /* local function prototypes */ - static void usage (int status); -@@ -437,6 +444,34 @@ - sgr_locked = false; - } - #endif /* SHADOWGRP */ -+ -+ if (is_sub_uid) { -+ if (sub_uid_close () == 0) { -+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ())); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+ /* continue */ -+ } -+ sub_uid_locked = false; -+ } -+ -+ if (is_sub_gid) { -+ if (sub_gid_close () == 0) { -+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ())); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+ /* continue */ -+ } -+ sub_gid_locked = false; -+ } - } - - /* -@@ -474,6 +509,20 @@ - } - } - #endif /* SHADOWGRP */ -+ if (sub_uid_locked) { -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+ /* continue */ -+ } -+ } -+ if (sub_gid_locked) { -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+ /* continue */ -+ } -+ } - - #ifdef WITH_AUDIT - audit_logger (AUDIT_DEL_USER, Prog, -@@ -595,6 +644,58 @@ - } - } - #endif /* SHADOWGRP */ -+ if (is_sub_uid) { -+ if (sub_uid_lock () == 0) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_uid_dbname ()); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_DEL_USER, Prog, -+ "locking subordinate user file", -+ user_name, (unsigned int) user_id, -+ SHADOW_AUDIT_FAILURE); -+#endif /* WITH_AUDIT */ -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ sub_uid_locked = true; -+ if (sub_uid_open (O_RDWR) == 0) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), Prog, sub_uid_dbname ()); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_DEL_USER, Prog, -+ "opening subordinate user file", -+ user_name, (unsigned int) user_id, -+ SHADOW_AUDIT_FAILURE); -+#endif /* WITH_AUDIT */ -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ } -+ if (is_sub_gid) { -+ if (sub_gid_lock () == 0) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_gid_dbname ()); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_DEL_USER, Prog, -+ "locking subordinate group file", -+ user_name, (unsigned int) user_id, -+ SHADOW_AUDIT_FAILURE); -+#endif /* WITH_AUDIT */ -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ sub_gid_locked = true; -+ if (sub_gid_open (O_RDWR) == 0) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), Prog, sub_gid_dbname ()); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_DEL_USER, Prog, -+ "opening subordinate group file", -+ user_name, (unsigned int) user_id, -+ SHADOW_AUDIT_FAILURE); -+#endif /* WITH_AUDIT */ -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ } - } - - /* -@@ -619,6 +720,18 @@ - Prog, user_name, spw_dbname ()); - fail_exit (E_PW_UPDATE); - } -+ if (is_sub_uid && sub_uid_remove(user_name, 0, ULONG_MAX) == 0) { -+ fprintf (stderr, -+ _("%s: cannot remove entry %lu from %s\n"), -+ Prog, (unsigned long)user_id, sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ if (is_sub_gid && sub_gid_remove(user_name, 0, ULONG_MAX) == 0) { -+ fprintf (stderr, -+ _("%s: cannot remove entry %lu from %s\n"), -+ Prog, (unsigned long)user_id, sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } - #ifdef WITH_AUDIT - audit_logger (AUDIT_DEL_USER, Prog, - "deleting user entries", -@@ -966,6 +1079,8 @@ - #ifdef SHADOWGRP - is_shadow_grp = sgr_file_present (); - #endif /* SHADOWGRP */ -+ is_sub_uid = sub_uid_file_present (); -+ is_sub_gid = sub_gid_file_present (); - - /* - * Start with a quick check to see if the user exists. diff --git a/debian/patches/userns/07_userns_useradd b/debian/patches/userns/07_userns_useradd deleted file mode 100644 index 35757e9a..00000000 --- a/debian/patches/userns/07_userns_useradd +++ /dev/null @@ -1,285 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:19:29 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id 61652C80DB; Tue, 22 Jan 2013 09:19:29 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id E0ABBC80F4 - for ; Tue, 22 Jan 2013 09:19:23 +0000 (UTC) -Received: from out03.mta.xmission.com ([166.70.13.233]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZzB-0008QG-Kq; Tue, 22 Jan 2013 02:17:41 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZz7-0005Ui-1H; Tue, 22 Jan 2013 02:17:37 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZz4-0004tF-BP; Tue, 22 Jan 2013 02:17:36 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:17:30 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <8738xtr2z9.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1/Jm5H2PcjgcLXEyKh9YL3DVs2WZBJhDB8= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 07/11] useradd: Add support for subordinate user identifiers -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2077 -Status: RO -Content-Length: 6886 -Lines: 235 - - -Signed-off-by: "Eric W. Biederman" ---- - src/useradd.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- - 1 files changed, 140 insertions(+), 1 deletions(-) - -Index: shadow/src/useradd.c -=================================================================== ---- shadow.orig/src/useradd.c 2013-02-01 15:27:52.668080362 -0600 -+++ shadow/src/useradd.c 2013-02-01 15:27:52.660080362 -0600 -@@ -65,6 +65,7 @@ - #include "sgroupio.h" - #endif - #include "shadowio.h" -+#include "subordinateio.h" - #ifdef WITH_TCB - #include "tcbfuncs.h" - #endif -@@ -121,12 +122,20 @@ - static bool is_shadow_grp; - static bool sgr_locked = false; - #endif -+static bool is_sub_uid = false; -+static bool is_sub_gid = false; - static bool pw_locked = false; - static bool gr_locked = false; - static bool spw_locked = false; -+static bool sub_uid_locked = false; -+static bool sub_gid_locked = false; - static char **user_groups; /* NULL-terminated list */ - static long sys_ngroups; - static bool do_grp_update = false; /* group files need to be updated */ -+static uid_t sub_uid_start; /* New subordinate uid range */ -+static unsigned long sub_uid_count; -+static gid_t sub_gid_start; /* New subordinate gid range */ -+static unsigned long sub_gid_count; - - static bool - bflg = false, /* new default root of home directory */ -@@ -168,6 +177,8 @@ - #define E_GRP_UPDATE 10 /* can't update group file */ - #define E_HOMEDIR 12 /* can't create home directory */ - #define E_SE_UPDATE 14 /* can't update SELinux user mapping */ -+#define E_SUB_UID_UPDATE 16 /* can't update the subordinate uid file */ -+#define E_SUB_GID_UPDATE 18 /* can't update the subordinate gid file */ - - #define DGROUP "GROUP=" - #define DHOME "HOME=" -@@ -268,6 +279,32 @@ - } - } - #endif -+ if (sub_uid_locked) { -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_ADD_USER, Prog, -+ "unlocking subodinate user file", -+ user_name, AUDIT_NO_ID, -+ SHADOW_AUDIT_FAILURE); -+#endif -+ /* continue */ -+ } -+ } -+ if (sub_gid_locked) { -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_ADD_USER, Prog, -+ "unlocking subodinate group file", -+ user_name, AUDIT_NO_ID, -+ SHADOW_AUDIT_FAILURE); -+#endif -+ /* continue */ -+ } -+ } - - #ifdef WITH_AUDIT - audit_logger (AUDIT_ADD_USER, Prog, -@@ -1379,6 +1416,18 @@ - } - #endif - } -+ if (is_sub_uid && (sub_uid_close () == 0)) { -+ fprintf (stderr, -+ _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ())); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ if (is_sub_gid && (sub_gid_close () == 0)) { -+ fprintf (stderr, -+ _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ())); -+ fail_exit (E_SUB_GID_UPDATE); -+ } - if (is_shadow_pwd) { - if (spw_unlock () == 0) { - fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, spw_dbname ()); -@@ -1433,6 +1482,34 @@ - sgr_locked = false; - } - #endif -+ if (is_sub_uid) { -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_ADD_USER, Prog, -+ "unlocking subordinate user file", -+ user_name, AUDIT_NO_ID, -+ SHADOW_AUDIT_FAILURE); -+#endif -+ /* continue */ -+ } -+ sub_uid_locked = false; -+ } -+ if (is_sub_gid) { -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+#ifdef WITH_AUDIT -+ audit_logger (AUDIT_ADD_USER, Prog, -+ "unlocking subordinate group file", -+ user_name, AUDIT_NO_ID, -+ SHADOW_AUDIT_FAILURE); -+#endif -+ /* continue */ -+ } -+ sub_gid_locked = false; -+ } - } - - /* -@@ -1487,6 +1564,36 @@ - } - } - #endif -+ if (is_sub_uid) { -+ if (sub_uid_lock () == 0) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ sub_uid_locked = true; -+ if (sub_uid_open (O_RDWR) == 0) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ } -+ if (is_sub_gid) { -+ if (sub_gid_lock () == 0) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ sub_gid_locked = true; -+ if (sub_gid_open (O_RDWR) == 0) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), -+ Prog, sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ } - } - - static void open_shadow (void) -@@ -1733,13 +1840,27 @@ - #endif - fail_exit (E_PW_UPDATE); - } -+ if (is_sub_uid && -+ (sub_uid_add(user_name, sub_uid_start, sub_uid_count) == 0)) { -+ fprintf (stderr, -+ _("%s: failed to prepare the new %s entry\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ if (is_sub_gid && -+ (sub_gid_add(user_name, sub_gid_start, sub_gid_count) == 0)) { -+ fprintf (stderr, -+ _("%s: failed to prepare the new %s entry\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ - #ifdef WITH_AUDIT - audit_logger (AUDIT_ADD_USER, Prog, - "adding user", - user_name, (unsigned int) user_id, - SHADOW_AUDIT_SUCCESS); - #endif -- - /* - * Do any group file updates for this user. - */ -@@ -1885,6 +2006,8 @@ - #ifdef SHADOWGRP - is_shadow_grp = sgr_file_present (); - #endif -+ is_sub_uid = sub_uid_file_present (); -+ is_sub_gid = sub_gid_file_present (); - - get_defaults (); - -@@ -2035,6 +2158,22 @@ - grp_add (); - } - -+ if (is_sub_uid) { -+ if (find_new_sub_uids(user_name, &sub_uid_start, &sub_uid_count) < 0) { -+ fprintf (stderr, -+ _("%s: can't find subordinate user range\n"), -+ Prog); -+ fail_exit(E_SUB_UID_UPDATE); -+ } -+ } -+ if (is_sub_gid) { -+ if (find_new_sub_gids(user_name, &sub_gid_start, &sub_gid_count) < 0) { -+ fprintf (stderr, -+ _("%s: can't find subordinate group range\n"), -+ Prog); -+ fail_exit(E_SUB_GID_UPDATE); -+ } -+ } - usr_update (); - - if (mflg) { diff --git a/debian/patches/userns/08_userns_detect_busy_subids b/debian/patches/userns/08_userns_detect_busy_subids deleted file mode 100644 index 72c28627..00000000 --- a/debian/patches/userns/08_userns_detect_busy_subids +++ /dev/null @@ -1,133 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:19:49 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id E0EA3C80F4; Tue, 22 Jan 2013 09:19:49 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=-2.2 required=8.0 tests=BAD_ENC_HEADER,BAYES_00, - RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 1A2C7C80D1 - for ; Tue, 22 Jan 2013 09:19:46 +0000 (UTC) -Received: from out03.mta.xmission.com ([166.70.13.233]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZzX-00006D-G7; Tue, 22 Jan 2013 02:18:03 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1TxZzV-0005Zh-Qq; Tue, 22 Jan 2013 02:18:02 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZzN-0004ul-H6; Tue, 22 Jan 2013 02:18:01 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:17:50 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87y5flpoe9.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1/ZWJZMWIVV2ekPIrRQjHLl4Oh/kdyWJUw= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 08/11] Add support for detecting busy subordinate user ids -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2078 -Status: RO -Content-Length: 2655 -Lines: 83 - - -Signed-off-by: "Eric W. Biederman" ---- - libmisc/user_busy.c | 18 +++++++++++++----- - 1 files changed, 13 insertions(+), 5 deletions(-) - -Index: shadow/libmisc/user_busy.c -=================================================================== ---- shadow.orig/libmisc/user_busy.c 2013-02-01 15:27:52.952080357 -0600 -+++ shadow/libmisc/user_busy.c 2013-02-01 15:27:52.948080357 -0600 -@@ -38,11 +38,13 @@ - #include - #include - #include -+#include - #include "defines.h" - #include "prototypes.h" -+#include "subordinateio.h" - - #ifdef __linux__ --static int check_status (const char *sname, uid_t uid); -+static int check_status (const char *name, const char *sname, uid_t uid); - static int user_busy_processes (const char *name, uid_t uid); - #else /* !__linux__ */ - static int user_busy_utmp (const char *name); -@@ -102,7 +104,7 @@ - #endif /* !__linux__ */ - - #ifdef __linux__ --static int check_status (const char *sname, uid_t uid) -+static int check_status (const char *name, const char *sname, uid_t uid) - { - /* 40: /proc/xxxxxxxxxx/task/xxxxxxxxxx/status + \0 */ - char status[40]; -@@ -125,7 +127,10 @@ - &ruid, &euid, &suid) == 3) { - if ( (ruid == (unsigned long) uid) - || (euid == (unsigned long) uid) -- || (suid == (unsigned long) uid)) { -+ || (suid == (unsigned long) uid) -+ || have_sub_uids(name, ruid, 1) -+ || have_sub_uids(name, euid, 1) -+ || have_sub_uids(name, suid, 1)) { - (void) fclose (sfile); - return 1; - } -@@ -153,6 +158,8 @@ - struct stat sbroot; - struct stat sbroot_process; - -+ sub_uid_open (O_RDONLY); -+ - proc = opendir ("/proc"); - if (proc == NULL) { - perror ("opendir /proc"); -@@ -196,7 +203,7 @@ - continue; - } - -- if (check_status (tmp_d_name, uid) != 0) { -+ if (check_status (name, tmp_d_name, uid) != 0) { - (void) closedir (proc); - fprintf (stderr, - _("%s: user %s is currently used by process %d\n"), -@@ -216,7 +223,7 @@ - if (tid == pid) { - continue; - } -- if (check_status (task_path+6, uid) != 0) { -+ if (check_status (name, task_path+6, uid) != 0) { - (void) closedir (proc); - fprintf (stderr, - _("%s: user %s is currently used by process %d\n"), -@@ -231,6 +238,7 @@ - } - - (void) closedir (proc); -+ sub_uid_close(); - return 0; - } - #endif /* __linux__ */ diff --git a/debian/patches/userns/09_userns_usermod b/debian/patches/userns/09_userns_usermod deleted file mode 100644 index 2fa5493b..00000000 --- a/debian/patches/userns/09_userns_usermod +++ /dev/null @@ -1,536 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:20:27 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id 8625BC80F4; Tue, 22 Jan 2013 09:20:27 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=0.1 required=8.0 tests=BAD_ENC_HEADER,BAYES_00 - autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 69CACC80D1 - for ; Tue, 22 Jan 2013 09:20:23 +0000 (UTC) -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1Txa08-0000JL-Uo; Tue, 22 Jan 2013 02:18:41 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1TxZzw-0004wm-8g; Tue, 22 Jan 2013 02:18:40 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:18:24 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87sj5tpodb.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1/EkNiL4owL54HOscHbdbK8RucFTofOBo8= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 09/11] usermod: Add support for subordinate uids and gids. -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2079 -Status: O -Content-Length: 15455 -Lines: 491 - - -Signed-off-by: "Eric W. Biederman" ---- - man/usermod.8.xml | 80 +++++++++++++++++ - src/usermod.c | 255 ++++++++++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 332 insertions(+), 3 deletions(-) - -Index: shadow/man/usermod.8.xml -=================================================================== ---- shadow.orig/man/usermod.8.xml 2013-02-01 15:27:53.240080352 -0600 -+++ shadow/man/usermod.8.xml 2013-02-01 15:27:53.232080353 -0600 -@@ -391,6 +391,86 @@ - - - -+ , -+ FIRST-LAST -+ -+ -+ -+ Add a range of subordinate uids to the users account. -+ -+ -+ This option may be specified multiple times to add multiple ranges to a users account. -+ -+ -+ No checks will be performed with regard to -+ , , or -+ from /etc/login.defs. -+ -+ -+ -+ -+ -+ , -+ FIRST-LAST -+ -+ -+ -+ Remove a range of subordinate uids from the users account. -+ -+ -+ This option may be specified multiple times to remove multiple ranges to a users account. -+ When both and are specified -+ remove of all subordinate uid ranges happens before any subordinate uid ranges are added. -+ -+ -+ No checks will be performed with regard to -+ , , or -+ from /etc/login.defs. -+ -+ -+ -+ -+ -+ , -+ FIRST-LAST -+ -+ -+ -+ Add a range of subordinate gids to the users account. -+ -+ -+ This option may be specified multiple times to add multiple ranges to a users account. -+ -+ -+ No checks will be performed with regard to -+ , , or -+ from /etc/login.defs. -+ -+ -+ -+ -+ -+ , -+ FIRST-LAST -+ -+ -+ -+ Remove a range of subordinate gids from the users account. -+ -+ -+ This option may be specified multiple times to remove multiple ranges to a users account. -+ When both and are specified -+ remove of all subordinate gid ranges happens before any subordinate gid ranges are added. -+ -+ -+ No checks will be performed with regard to -+ , , or -+ from /etc/login.defs. -+ -+ -+ -+ -+ - , - SEUSER - -Index: shadow/src/usermod.c -=================================================================== ---- shadow.orig/src/usermod.c 2013-02-01 15:27:53.240080352 -0600 -+++ shadow/src/usermod.c 2013-02-01 15:27:53.236080353 -0600 -@@ -63,6 +63,7 @@ - #include "sgroupio.h" - #endif - #include "shadowio.h" -+#include "subordinateio.h" - #ifdef WITH_TCB - #include "tcbfuncs.h" - #endif -@@ -86,6 +87,8 @@ - /* #define E_NOSPACE 11 insufficient space to move home dir */ - #define E_HOMEDIR 12 /* unable to complete home dir move */ - #define E_SE_UPDATE 13 /* can't update SELinux user mapping */ -+#define E_SUB_UID_UPDATE 16 /* can't update the subordinate uid file */ -+#define E_SUB_GID_UPDATE 18 /* can't update the subordinate gid file */ - #define VALID(s) (strcspn (s, ":\n") == strlen (s)) - /* - * Global variables -@@ -133,7 +136,11 @@ - Zflg = false, /* new selinux user */ - #endif - uflg = false, /* specify new user ID */ -- Uflg = false; /* unlock the password */ -+ Uflg = false, /* unlock the password */ -+ vflg = false, /* add subordinate uids */ -+ Vflg = false, /* delete subordinate uids */ -+ wflg = false, /* add subordinate gids */ -+ Wflg = false; /* delete subordinate gids */ - - static bool is_shadow_pwd; - -@@ -141,12 +148,17 @@ - static bool is_shadow_grp; - #endif - -+static bool is_sub_uid = false; -+static bool is_sub_gid = false; -+ - static bool pw_locked = false; - static bool spw_locked = false; - static bool gr_locked = false; - #ifdef SHADOWGRP - static bool sgr_locked = false; - #endif -+static bool sub_uid_locked = false; -+static bool sub_gid_locked = false; - - - /* local function prototypes */ -@@ -302,6 +314,69 @@ - return 0; - } - -+struct ulong_range -+{ -+ unsigned long first; -+ unsigned long last; -+}; -+ -+static struct ulong_range getulong_range(const char *str) -+{ -+ struct ulong_range result = { .first = ULONG_MAX, .last = 0 }; -+ unsigned long long first, last; -+ char *pos; -+ -+ errno = 0; -+ first = strtoll(str, &pos, 10); -+ if (('\0' == *str) || ('-' != *pos ) || (ERANGE == errno) || -+ (first != (unsigned long int)first)) -+ goto out; -+ -+ errno = 0; -+ last = strtoul(pos + 1, &pos, 10); -+ if (('\0' != *pos ) || (ERANGE == errno) || -+ (last != (unsigned long int)last)) -+ goto out; -+ -+ if (first > last) -+ goto out; -+ -+ result.first = (unsigned long int)first; -+ result.last = (unsigned long int)last; -+out: -+ return result; -+ -+} -+ -+struct ulong_range_list_entry { -+ struct ulong_range_list_entry *next; -+ struct ulong_range range; -+}; -+ -+static struct ulong_range_list_entry *add_sub_uids = NULL, *del_sub_uids = NULL; -+static struct ulong_range_list_entry *add_sub_gids = NULL, *del_sub_gids = NULL; -+ -+static int prepend_range(const char *str, struct ulong_range_list_entry **head) -+{ -+ struct ulong_range range; -+ struct ulong_range_list_entry *entry; -+ range = getulong_range(str); -+ if (range.first > range.last) -+ return 0; -+ -+ entry = malloc(sizeof(*entry)); -+ if (!entry) { -+ fprintf (stderr, -+ _("%s: failed to allocate memory: %s\n"), -+ Prog, strerror (errno)); -+ return 0; -+ } -+ entry->next = *head; -+ entry->range = range; -+ *head = entry; -+ return 1; -+} -+ - /* - * usage - display usage message and exit - */ -@@ -334,6 +409,10 @@ - (void) fputs (_(" -s, --shell SHELL new login shell for the user account\n"), usageout); - (void) fputs (_(" -u, --uid UID new UID for the user account\n"), usageout); - (void) fputs (_(" -U, --unlock unlock the user account\n"), usageout); -+ (void) fputs (_(" -v, --add-subuids FIRST-LAST add range of subordinate uids\n"), usageout); -+ (void) fputs (_(" -V, --del-subuids FIRST-LAST remvoe range of subordinate uids\n"), usageout); -+ (void) fputs (_(" -w, --add-subgids FIRST-LAST add range of subordinate gids\n"), usageout); -+ (void) fputs (_(" -W, --del-subgids FIRST-LAST remvoe range of subordinate gids\n"), usageout); - #ifdef WITH_SELINUX - (void) fputs (_(" -Z, --selinux-user SEUSER new SELinux user mapping for the user account\n"), usageout); - #endif /* WITH_SELINUX */ -@@ -590,6 +669,20 @@ - /* continue */ - } - } -+ if (sub_uid_locked) { -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+ /* continue */ -+ } -+ } -+ if (sub_gid_locked) { -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+ /* continue */ -+ } -+ } - - #ifdef WITH_AUDIT - audit_logger (AUDIT_USER_CHAUTHTOK, Prog, -@@ -889,6 +982,10 @@ - {"shell", required_argument, NULL, 's'}, - {"uid", required_argument, NULL, 'u'}, - {"unlock", no_argument, NULL, 'U'}, -+ {"add-subuids", required_argument, NULL, 'v'}, -+ {"del-subuids", required_argument, NULL, 'V'}, -+ {"add-subgids", required_argument, NULL, 'w'}, -+ {"del-subgids", required_argument, NULL, 'W'}, - #ifdef WITH_SELINUX - {"selinux-user", required_argument, NULL, 'Z'}, - #endif /* WITH_SELINUX */ -@@ -1018,6 +1115,41 @@ - case 'U': - Uflg = true; - break; -+ case 'v': -+ if (prepend_range (optarg, &add_sub_uids) == 0) { -+ fprintf (stderr, -+ _("%s: invalid subordinate uid range '%s'\n"), -+ Prog, optarg); -+ exit(E_BAD_ARG); -+ } -+ vflg = true; -+ break; -+ case 'V': -+ if (prepend_range (optarg, &del_sub_uids) == 0) { -+ fprintf (stderr, -+ _("%s: invalid subordinate uid range '%s'\n"), -+ Prog, optarg); -+ exit(E_BAD_ARG); -+ } -+ Vflg = true; -+ break; -+ case 'w': -+ if (prepend_range (optarg, &add_sub_gids) == 0) { -+ fprintf (stderr, -+ _("%s: invalid subordinate gid range '%s'\n"), -+ Prog, optarg); -+ exit(E_BAD_ARG); -+ } -+ wflg = true; -+ case 'W': -+ if (prepend_range (optarg, &del_sub_gids) == 0) { -+ fprintf (stderr, -+ _("%s: invalid subordinate gid range '%s'\n"), -+ Prog, optarg); -+ exit(E_BAD_ARG); -+ } -+ Wflg = true; -+ break; - #ifdef WITH_SELINUX - case 'Z': - if (is_selinux_enabled () > 0) { -@@ -1170,6 +1302,7 @@ - - if (!(Uflg || uflg || sflg || pflg || mflg || Lflg || - lflg || Gflg || gflg || fflg || eflg || dflg || cflg -+ || vflg || Vflg || wflg || Wflg - #ifdef WITH_SELINUX - || Zflg - #endif /* WITH_SELINUX */ -@@ -1200,6 +1333,7 @@ - Prog, (unsigned long) user_newid); - exit (E_UID_IN_USE); - } -+ - } - - /* -@@ -1248,6 +1382,10 @@ - sgr_dbname ())); - fail_exit (E_GRP_UPDATE); - } -+ } -+#endif -+#ifdef SHADOWGRP -+ if (is_shadow_grp) { - if (sgr_unlock () == 0) { - fprintf (stderr, - _("%s: failed to unlock %s\n"), -@@ -1296,6 +1434,33 @@ - sgr_locked = false; - #endif - -+ if (vflg || Vflg) { -+ if (!is_sub_uid || (sub_uid_close () == 0)) { -+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ())); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ if (!is_sub_uid || (sub_uid_unlock () == 0)) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+ /* continue */ -+ } -+ sub_uid_locked = false; -+ } -+ if (wflg || Wflg) { -+ if (!is_sub_gid || (sub_gid_close () == 0)) { -+ fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ())); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ if (!is_sub_gid || (sub_gid_unlock () == 0)) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+ /* continue */ -+ } -+ sub_gid_locked = false; -+ } -+ - /* - * Close the DBM and/or flat files - */ -@@ -1375,6 +1540,36 @@ - } - #endif - } -+ if (vflg || Vflg) { -+ if (!is_sub_uid || (sub_uid_lock () == 0)) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ sub_uid_locked = true; -+ if (!is_sub_uid || (sub_uid_open (O_RDWR) == 0)) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ } -+ if (wflg || Wflg) { -+ if (!is_sub_gid || (sub_gid_lock () == 0)) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ sub_gid_locked = true; -+ if (!is_sub_gid || (sub_gid_open (O_RDWR) == 0)) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), -+ Prog, sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ } - } - - /* -@@ -1476,6 +1671,58 @@ - fail_exit (E_PW_UPDATE); - } - } -+ if (Vflg) { -+ struct ulong_range_list_entry *ptr; -+ for (ptr = del_sub_uids; ptr != NULL; ptr = ptr->next) { -+ unsigned long count = ptr->range.last - ptr->range.first + 1; -+ if (sub_uid_remove(user_name, ptr->range.first, count) == 0) { -+ fprintf (stderr, -+ _("%s: failed to remove uid range %lu-%lu from '%s'\n"), -+ Prog, ptr->range.first, ptr->range.last, -+ sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ } -+ } -+ if (vflg) { -+ struct ulong_range_list_entry *ptr; -+ for (ptr = add_sub_uids; ptr != NULL; ptr = ptr->next) { -+ unsigned long count = ptr->range.last - ptr->range.first + 1; -+ if (sub_uid_add(user_name, ptr->range.first, count) == 0) { -+ fprintf (stderr, -+ _("%s: failed to add uid range %lu-%lu from '%s'\n"), -+ Prog, ptr->range.first, ptr->range.last, -+ sub_uid_dbname ()); -+ fail_exit (E_SUB_UID_UPDATE); -+ } -+ } -+ } -+ if (Wflg) { -+ struct ulong_range_list_entry *ptr; -+ for (ptr = del_sub_gids; ptr != NULL; ptr = ptr->next) { -+ unsigned long count = ptr->range.last - ptr->range.first + 1; -+ if (sub_gid_remove(user_name, ptr->range.first, count) == 0) { -+ fprintf (stderr, -+ _("%s: failed to remove gid range %lu-%lu from '%s'\n"), -+ Prog, ptr->range.first, ptr->range.last, -+ sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ } -+ } -+ if (wflg) { -+ struct ulong_range_list_entry *ptr; -+ for (ptr = add_sub_gids; ptr != NULL; ptr = ptr->next) { -+ unsigned long count = ptr->range.last - ptr->range.first + 1; -+ if (sub_gid_add(user_name, ptr->range.first, count) == 0) { -+ fprintf (stderr, -+ _("%s: failed to add gid range %lu-%lu from '%s'\n"), -+ Prog, ptr->range.first, ptr->range.last, -+ sub_gid_dbname ()); -+ fail_exit (E_SUB_GID_UPDATE); -+ } -+ } -+ } - } - - /* -@@ -1811,6 +2058,8 @@ - #ifdef SHADOWGRP - is_shadow_grp = sgr_file_present (); - #endif -+ is_sub_uid = sub_uid_file_present (); -+ is_sub_gid = sub_gid_file_present (); - - process_flags (argc, argv); - -@@ -1818,7 +2067,7 @@ - * The home directory, the username and the user's UID should not - * be changed while the user is logged in. - */ -- if ( (uflg || lflg || dflg) -+ if ( (uflg || lflg || dflg || Vflg || Wflg) - && (user_busy (user_name, user_id) != 0)) { - exit (E_USER_BUSY); - } -@@ -1871,7 +2120,7 @@ - */ - open_files (); - if ( cflg || dflg || eflg || fflg || gflg || Lflg || lflg || pflg -- || sflg || uflg || Uflg) { -+ || sflg || uflg || Uflg || vflg || Vflg || wflg || Wflg) { - usr_update (); - } - if (Gflg || lflg) { diff --git a/debian/patches/userns/10_userns_newusers b/debian/patches/userns/10_userns_newusers deleted file mode 100644 index 8072cf7a..00000000 --- a/debian/patches/userns/10_userns_newusers +++ /dev/null @@ -1,256 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:21:21 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id ADE59C80F5; Tue, 22 Jan 2013 09:21:21 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=-2.2 required=8.0 tests=BAD_ENC_HEADER,BAYES_00, - RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id D56AEC80DB - for ; Tue, 22 Jan 2013 09:21:17 +0000 (UTC) -Received: from out03.mta.xmission.com ([166.70.13.233]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1Txa11-0000bo-MQ; Tue, 22 Jan 2013 02:19:35 -0700 -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out03.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1Txa11-0005wx-1p; Tue, 22 Jan 2013 02:19:35 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1Txa0y-000519-2O; Tue, 22 Jan 2013 02:19:34 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:19:28 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87k3r5pobj.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1+qhualZ5pxk+DVqanIJA7JrJwlPXicL8c= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 10/11] newusers: Add support for assiging subordinate uids and gids. -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2080 -Status: O -Content-Length: 5597 -Lines: 206 - - -Signed-off-by: "Eric W. Biederman" ---- - src/newusers.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 124 insertions(+), 0 deletions(-) - -Index: shadow/src/newusers.c -=================================================================== ---- shadow.orig/src/newusers.c 2013-02-01 15:27:53.548080347 -0600 -+++ shadow/src/newusers.c 2013-02-01 15:27:53.540080347 -0600 -@@ -65,6 +65,7 @@ - #include "pwio.h" - #include "sgroupio.h" - #include "shadowio.h" -+#include "subordinateio.h" - #include "chkname.h" - - /* -@@ -82,6 +83,8 @@ - #endif /* USE_SHA_CRYPT */ - #endif /* !USE_PAM */ - -+static bool is_sub_uid = false; -+static bool is_sub_gid = false; - static bool is_shadow; - #ifdef SHADOWGRP - static bool is_shadow_grp; -@@ -90,6 +93,8 @@ - static bool pw_locked = false; - static bool gr_locked = false; - static bool spw_locked = false; -+static bool sub_uid_locked = false; -+static bool sub_gid_locked = false; - - /* local function prototypes */ - static void usage (int status); -@@ -178,6 +183,20 @@ - } - } - #endif -+ if (sub_uid_locked) { -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+ /* continue */ -+ } -+ } -+ if (sub_gid_locked) { -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+ /* continue */ -+ } -+ } - - exit (code); - } -@@ -732,6 +751,24 @@ - sgr_locked = true; - } - #endif -+ if (is_sub_uid) { -+ if (sub_uid_lock () == 0) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (EXIT_FAILURE); -+ } -+ sub_uid_locked = true; -+ } -+ if (is_sub_gid) { -+ if (sub_gid_lock () == 0) { -+ fprintf (stderr, -+ _("%s: cannot lock %s; try again later.\n"), -+ Prog, sub_gid_dbname ()); -+ fail_exit (EXIT_FAILURE); -+ } -+ sub_gid_locked = true; -+ } - - if (pw_open (O_RDWR) == 0) { - fprintf (stderr, _("%s: cannot open %s\n"), Prog, pw_dbname ()); -@@ -751,6 +788,22 @@ - fail_exit (EXIT_FAILURE); - } - #endif -+ if (is_sub_uid) { -+ if (sub_uid_open (O_RDWR) == 0) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), -+ Prog, sub_uid_dbname ()); -+ fail_exit (EXIT_FAILURE); -+ } -+ } -+ if (is_sub_gid) { -+ if (sub_gid_open (O_RDWR) == 0) { -+ fprintf (stderr, -+ _("%s: cannot open %s\n"), -+ Prog, sub_gid_dbname ()); -+ fail_exit (EXIT_FAILURE); -+ } -+ } - } - - /* -@@ -795,6 +848,19 @@ - SYSLOG ((LOG_ERR, "failure while writing changes to %s", gr_dbname ())); - fail_exit (EXIT_FAILURE); - } -+ if (is_sub_uid && (sub_uid_close () == 0)) { -+ fprintf (stderr, -+ _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ())); -+ fail_exit (EXIT_FAILURE); -+ } -+ if (is_sub_gid && (sub_gid_close () == 0)) { -+ fprintf (stderr, -+ _("%s: failure while writing changes to %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_gid_dbname ())); -+ fail_exit (EXIT_FAILURE); -+ } -+ - if (gr_unlock () == 0) { - fprintf (stderr, - _("%s: failed to unlock %s\n"), -@@ -823,6 +889,22 @@ - sgr_locked = false; - } - #endif -+ if (is_sub_uid) { -+ if (sub_uid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_uid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_uid_dbname ())); -+ /* continue */ -+ } -+ sub_uid_locked = false; -+ } -+ if (is_sub_gid) { -+ if (sub_gid_unlock () == 0) { -+ fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, sub_gid_dbname ()); -+ SYSLOG ((LOG_ERR, "failed to unlock %s", sub_gid_dbname ())); -+ /* continue */ -+ } -+ sub_gid_locked = false; -+ } - } - - int main (int argc, char **argv) -@@ -864,6 +946,8 @@ - #ifdef SHADOWGRP - is_shadow_grp = sgr_file_present (); - #endif -+ is_sub_uid = sub_uid_file_present (); -+ is_sub_gid = sub_gid_file_present (); - - open_files (); - -@@ -1044,6 +1128,46 @@ - errors++; - continue; - } -+ -+ /* -+ * Add subordinate uids if the user does not have them. -+ */ -+ if (is_sub_uid && !sub_uid_assigned(fields[0])) { -+ uid_t sub_uid_start = 0; -+ unsigned long sub_uid_count = 0; -+ if (find_new_sub_uids(fields[0], &sub_uid_start, &sub_uid_count) == 0) { -+ if (sub_uid_add(fields[0], sub_uid_start, sub_uid_count) == 0) { -+ fprintf (stderr, -+ _("%s: failed to prepare new %s entry\n"), -+ Prog, sub_uid_dbname ()); -+ } -+ } else { -+ fprintf (stderr, -+ _("%s: can't find subordinate user range\n"), -+ Prog); -+ errors++; -+ } -+ } -+ -+ /* -+ * Add subordinate gids if the user does not have them. -+ */ -+ if (is_sub_gid && !sub_gid_assigned(fields[0])) { -+ gid_t sub_gid_start = 0; -+ unsigned long sub_gid_count = 0; -+ if (find_new_sub_gids(fields[0], &sub_gid_start, &sub_gid_count) == 0) { -+ if (sub_gid_add(fields[0], sub_gid_start, sub_gid_count) == 0) { -+ fprintf (stderr, -+ _("%s: failed to prepare new %s entry\n"), -+ Prog, sub_uid_dbname ()); -+ } -+ } else { -+ fprintf (stderr, -+ _("%s: can't find subordinate group range\n"), -+ Prog); -+ errors++; -+ } -+ } - } - - /* diff --git a/debian/patches/userns/11_userns_newxidmap b/debian/patches/userns/11_userns_newxidmap deleted file mode 100644 index f4e6a199..00000000 --- a/debian/patches/userns/11_userns_newxidmap +++ /dev/null @@ -1,1004 +0,0 @@ -From ebiederm@xmission.com Tue Jan 22 09:22:07 2013 -Return-Path: -X-Original-To: serge@hallyn.com -Delivered-To: serge@hallyn.com -Received: by mail.hallyn.com (Postfix, from userid 5001) - id E5D16C80F4; Tue, 22 Jan 2013 09:22:07 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail -X-Spam-Level: -X-Spam-Status: No, score=-0.2 required=8.0 tests=BAD_ENC_HEADER,BAYES_00, - LONGWORDS,RCVD_IN_DNSWL_MED autolearn=no version=3.3.1 -Received: from out02.mta.xmission.com (out02.mta.xmission.com [166.70.13.232]) - (using TLSv1 with cipher AES256-SHA (256/256 bits)) - (No client certificate requested) - by mail.hallyn.com (Postfix) with ESMTPS id 2E206C80D1 - for ; Tue, 22 Jan 2013 09:22:03 +0000 (UTC) -Received: from in02.mta.xmission.com ([166.70.13.52]) - by out02.mta.xmission.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) - (Exim 4.76) - (envelope-from ) - id 1Txa1k-0000xE-Ix; Tue, 22 Jan 2013 02:20:20 -0700 -Received: from c-98-207-153-68.hsd1.ca.comcast.net ([98.207.153.68] helo=eric-ThinkPad-X220.xmission.com) - by in02.mta.xmission.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) - (Exim 4.76) - (envelope-from ) - id 1Txa1b-00059T-Lu; Tue, 22 Jan 2013 02:20:20 -0700 -From: ebiederm@xmission.com (Eric W. Biederman) -To: Nicolas =?utf-8?Q?Fran=C3=A7ois?= -Cc: , Linux Containers , "Michael Kerrisk \(man-pages\)" , "Serge E. Hallyn" -References: <87d2wxshu0.fsf@xmission.com> -Date: Tue, 22 Jan 2013 01:20:07 -0800 -In-Reply-To: <87d2wxshu0.fsf@xmission.com> (Eric W. Biederman's message of - "Tue, 22 Jan 2013 01:11:19 -0800") -Message-ID: <87ehhdpoag.fsf@xmission.com> -User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) -MIME-Version: 1.0 -Content-Type: text/plain -X-XM-AID: U2FsdGVkX1/nox3f5bDq7zL9eOiGra/HoCkv7o07HDs= -X-SA-Exim-Connect-IP: 98.207.153.68 -X-SA-Exim-Mail-From: ebiederm@xmission.com -Subject: [PATCH 11/11] newuidmap,newgidmap: New suid helpers for using subordinate uids and gids -X-SA-Exim-Version: 4.2.1 (built Wed, 14 Nov 2012 14:26:46 -0700) -X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) -X-UID: 2081 -Status: RO -Content-Length: 31344 -Lines: 965 - - -Signed-off-by: "Eric W. Biederman" ---- - libmisc/Makefile.am | 2 + - libmisc/idmapping.c | 126 +++++++++++++++++++++++++++++++++++ - libmisc/idmapping.h | 44 ++++++++++++ - man/Makefile.am | 4 + - man/newgidmap.1.xml | 157 +++++++++++++++++++++++++++++++++++++++++++ - man/newuidmap.1.xml | 154 +++++++++++++++++++++++++++++++++++++++++++ - src/Makefile.am | 5 +- - src/newgidmap.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++ - src/newuidmap.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 9 files changed, 856 insertions(+), 2 deletions(-) - create mode 100644 libmisc/idmapping.c - create mode 100644 libmisc/idmapping.h - create mode 100644 man/newgidmap.1.xml - create mode 100644 man/newuidmap.1.xml - create mode 100644 src/newgidmap.c - create mode 100644 src/newuidmap.c - -Index: shadow/libmisc/Makefile.am -=================================================================== ---- shadow.orig/libmisc/Makefile.am 2013-02-01 15:27:53.836080342 -0600 -+++ shadow/libmisc/Makefile.am 2013-02-01 15:27:53.828080343 -0600 -@@ -32,6 +32,8 @@ - getgr_nam_gid.c \ - getrange.c \ - hushed.c \ -+ idmapping.h \ -+ idmapping.c \ - isexpired.c \ - limits.c \ - list.c log.c \ -Index: shadow/libmisc/idmapping.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/libmisc/idmapping.c 2013-02-01 15:27:53.828080343 -0600 -@@ -0,0 +1,126 @@ -+/* -+ * Copyright (c) 2013 Eric Biederman -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include "prototypes.h" -+#include "idmapping.h" -+ -+struct map_range *get_map_ranges(int ranges, int argc, char **argv) -+{ -+ struct map_range *mappings, *mapping; -+ int idx, argidx; -+ -+ if ((ranges * 3) > argc) { -+ fprintf(stderr, "ranges: %u argc: %d\n", -+ ranges, argc); -+ fprintf(stderr, -+ _( "%s: Not enough arguments to form %u mappings\n"), -+ Prog, ranges); -+ return NULL; -+ } -+ -+ mappings = calloc(ranges, sizeof(*mappings)); -+ if (!mappings) { -+ fprintf(stderr, _( "%s: Memory allocation failure\n"), -+ Prog); -+ exit(EXIT_FAILURE); -+ } -+ -+ /* Gather up the ranges from the command line */ -+ mapping = mappings; -+ for (idx = 0; idx < ranges; idx++, argidx += 3, mapping++) { -+ if (!getulong(argv[argidx + 0], &mapping->upper)) -+ return NULL; -+ if (!getulong(argv[argidx + 1], &mapping->lower)) -+ return NULL; -+ if (!getulong(argv[argidx + 2], &mapping->count)) -+ return NULL; -+ } -+ return mappings; -+} -+ -+/* Number of ascii digits needed to print any unsigned long in decimal. -+ * There are approximately 10 bits for every 3 decimal digits. -+ * So from bits to digits the formula is roundup((Number of bits)/10) * 3. -+ * For common sizes of integers this works out to: -+ * 2bytes --> 6 ascii estimate -> 65536 (5 real) -+ * 4bytes --> 12 ascii estimated -> 4294967296 (10 real) -+ * 8bytes --> 21 ascii estimated -> 18446744073709551616 (20 real) -+ * 16bytes --> 39 ascii estimated -> 340282366920938463463374607431768211456 (39 real) -+ */ -+#define ULONG_DIGITS ((((sizeof(unsigned long) * CHAR_BIT) + 9)/10)*3) -+ -+ -+void write_mapping(int proc_dir_fd, int ranges, struct map_range *mappings, -+ const char *map_file) -+{ -+ int idx; -+ struct map_range *mapping; -+ size_t bufsize; -+ char *buf, *pos; -+ int fd; -+ -+ bufsize = ranges * ((ULONG_DIGITS + 1) * 3); -+ pos = buf = xmalloc(bufsize); -+ -+ /* Build the mapping command */ -+ mapping = mappings; -+ for (idx = 0; idx < ranges; idx++, mapping++) { -+ /* Append this range to the string that will be written */ -+ int written = snprintf(pos, bufsize - (pos - buf), -+ "%lu %lu %lu\n", -+ mapping->upper, -+ mapping->lower, -+ mapping->count); -+ if ((written <= 0) || (written >= (bufsize - (pos - buf)))) { -+ fprintf(stderr, _("%s: snprintf failed!\n"), Prog); -+ exit(EXIT_FAILURE); -+ } -+ pos += written; -+ } -+ -+ /* Write the mapping to the maping file */ -+ fd = openat(proc_dir_fd, map_file, O_WRONLY); -+ if (fd < 0) { -+ fprintf(stderr, _("%s: open of %s failed: %s\n"), -+ Prog, map_file, strerror(errno)); -+ exit(EXIT_FAILURE); -+ } -+ if (write(fd, buf, pos - buf) != (pos - buf)) { -+ fprintf(stderr, _("%s: write to %s failed: %s\n"), -+ Prog, map_file, strerror(errno)); -+ exit(EXIT_FAILURE); -+ } -+ close(fd); -+} -Index: shadow/libmisc/idmapping.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/libmisc/idmapping.h 2013-02-01 15:27:53.828080343 -0600 -@@ -0,0 +1,44 @@ -+/* -+ * Copyright (c) 2013 Eric Biederman -+ * 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. -+ */ -+ -+#ifndef _IDMAPPING_H_ -+#define _IDMAPPING_H_ -+ -+struct map_range { -+ unsigned long upper; -+ unsigned long lower; -+ unsigned long count; -+}; -+ -+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); -+ -+#endif /* _ID_MAPPING_H_ */ -+ -Index: shadow/man/Makefile.am -=================================================================== ---- shadow.orig/man/Makefile.am 2013-02-01 15:27:53.836080342 -0600 -+++ shadow/man/Makefile.am 2013-02-01 15:27:53.828080343 -0600 -@@ -30,7 +30,9 @@ - man1/login.1 \ - man5/login.defs.5 \ - man8/logoutd.8 \ -+ man1/newgidmap.1 \ - man1/newgrp.1 \ -+ man1/newuidmap.1 \ - man8/newusers.8 \ - man8/nologin.8 \ - man1/passwd.1 \ -@@ -83,7 +85,9 @@ - login.access.5.xml \ - login.defs.5.xml \ - logoutd.8.xml \ -+ newgidmap.1.xml \ - newgrp.1.xml \ -+ newuidmap.1.xml \ - newusers.8.xml \ - nologin.8.xml \ - passwd.1.xml \ -Index: shadow/man/newgidmap.1.xml -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/man/newgidmap.1.xml 2013-02-01 15:27:53.828080343 -0600 -@@ -0,0 +1,157 @@ -+ -+ -+ -+]> -+ -+ -+ -+ newgidmap -+ 1 -+ User Commands -+ shadow-utils -+ &SHADOW_UTILS_VERSION; -+ -+ -+ newgidmap -+ set the gid mapping of a user namespace -+ -+ -+ -+ -+ newgidmap -+ -+ pid -+ -+ -+ gid -+ -+ -+ lowergid -+ -+ -+ count -+ -+ -+ -+ pid -+ -+ -+ gid -+ -+ -+ lowergid -+ -+ -+ count -+ -+ -+ ... -+ -+ -+ -+ -+ -+ -+ DESCRIPTION -+ -+ The newgidmap sets /proc/[pid]/gid_map based on it's -+ command line arguments and the gids allowed in /etc/subgid. -+ -+ -+ -+ -+ -+ OPTIONS -+ -+ There currently are no options to the newgidmap command. -+ -+ -+ -+ -+ -+ -+ NOTE -+ -+ The only restriction placed on the login shell is that the command -+ name must be listed in /etc/shells, unless the -+ invoker is the superuser, and then any value may be added. An -+ account with a restricted login shell may not change her login shell. -+ For this reason, placing /bin/rsh in -+ /etc/shells is discouraged since accidentally -+ changing to a restricted shell would prevent the user from ever -+ changing her login shell back to its original value. -+ -+ -+ -+ -+ -+ FILES -+ -+ -+ /etc/subgid -+ -+ List of users subordinate user IDs. -+ -+ -+ -+ /proc/[pid]/gid_map -+ -+ Mapping of gids from one between user namespaces. -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ login.defs5 -+ , -+ -+ useradd8 -+ , -+ -+ usermod8 -+ , -+ -+ newusers8 -+ , -+ -+ userdel8 -+ , -+ -+ subgid5 -+ . -+ -+ -+ -Index: shadow/man/newuidmap.1.xml -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/man/newuidmap.1.xml 2013-02-01 15:27:53.828080343 -0600 -@@ -0,0 +1,154 @@ -+ -+ -+ -+]> -+ -+ -+ -+ newuidmap -+ 1 -+ User Commands -+ shadow-utils -+ &SHADOW_UTILS_VERSION; -+ -+ -+ newuidmap -+ set the uid mapping of a user namespace -+ -+ -+ -+ -+ newuidmap -+ -+ pid -+ -+ -+ uid -+ -+ -+ loweruid -+ -+ -+ count -+ -+ -+ -+ uid -+ -+ -+ loweruid -+ -+ -+ count -+ -+ -+ ... -+ -+ -+ -+ -+ -+ -+ DESCRIPTION -+ -+ The newuidmap sets /proc/[pid]/uid_map based on it's -+ command line arguments and the uids allowed in /etc/subuid. -+ -+ -+ -+ -+ -+ OPTIONS -+ -+ There currently are no options to the newuidmap command. -+ -+ -+ -+ -+ -+ -+ NOTE -+ -+ The only restriction placed on the login shell is that the command -+ name must be listed in /etc/shells, unless the -+ invoker is the superuser, and then any value may be added. An -+ account with a restricted login shell may not change her login shell. -+ For this reason, placing /bin/rsh in -+ /etc/shells is discouraged since accidentally -+ changing to a restricted shell would prevent the user from ever -+ changing her login shell back to its original value. -+ -+ -+ -+ -+ -+ FILES -+ -+ -+ /etc/subuid -+ -+ List of users subordinate user IDs. -+ -+ -+ -+ /proc/[pid]/uid_map -+ -+ Mapping of uids from one between user namespaces. -+ -+ -+ -+ -+ -+ -+ SEE ALSO -+ -+ -+ login.defs5 -+ , -+ -+ useradd8 -+ , -+ -+ usermod8 -+ , -+ -+ newusers8 -+ , -+ -+ userdel8 -+ , -+ -+ subuid5 -+ . -+ -+ -+ -Index: shadow/src/Makefile.am -=================================================================== ---- shadow.orig/src/Makefile.am 2013-02-01 15:27:53.836080342 -0600 -+++ shadow/src/Makefile.am 2013-02-01 15:27:53.832080342 -0600 -@@ -23,7 +23,8 @@ - # $prefix/bin and $prefix/sbin, no install-data hacks...) - - bin_PROGRAMS = groups login su --ubin_PROGRAMS = faillog lastlog chage chfn chsh expiry gpasswd newgrp passwd -+ubin_PROGRAMS = faillog lastlog chage chfn chsh expiry gpasswd newgrp passwd \ -+ newgidmap newuidmap - usbin_PROGRAMS = \ - cppw \ - chgpasswd \ -@@ -50,7 +51,7 @@ - noinst_PROGRAMS = id sulogin - - suidbins = su --suidubins = chage chfn chsh expiry gpasswd newgrp passwd -+suidubins = chage chfn chsh expiry gpasswd newgrp passwd newuidmap newgidmap - if ACCT_TOOLS_SETUID - suidubins += chage chgpasswd chpasswd groupadd groupdel groupmod newusers useradd userdel usermod - endif -Index: shadow/src/newgidmap.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/src/newgidmap.c 2013-02-01 15:27:53.832080342 -0600 -@@ -0,0 +1,183 @@ -+/* -+ * Copyright (c) 2013 Eric Biederman -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "defines.h" -+#include "prototypes.h" -+#include "subordinateio.h" -+#include "idmapping.h" -+ -+/* -+ * Global variables -+ */ -+const char *Prog; -+ -+static bool verify_range(struct passwd *pw, struct map_range *range) -+{ -+ /* An empty range is invalid */ -+ if (range->count == 0) -+ return false; -+ -+ /* Test /etc/subgid */ -+ if (have_sub_gids(pw->pw_name, range->lower, range->count)) -+ return true; -+ -+ /* Allow a process to map it's own gid */ -+ if ((range->count == 1) && (pw->pw_gid == range->lower)) -+ return true; -+ -+ return false; -+} -+ -+static void verify_ranges(struct passwd *pw, int ranges, -+ struct map_range *mappings) -+{ -+ struct map_range *mapping; -+ int idx; -+ -+ mapping = mappings; -+ for (idx = 0; idx < ranges; idx++, mapping++) { -+ if (!verify_range(pw, mapping)) { -+ fprintf(stderr, _( "%s: gid range [%lu-%lu) -> [%lu-%lu) not allowed\n"), -+ Prog, -+ mapping->upper, -+ mapping->upper + mapping->count, -+ mapping->lower, -+ mapping->lower + mapping->count); -+ exit(EXIT_FAILURE); -+ } -+ } -+} -+ -+static void usage(void) -+{ -+ fprintf(stderr, _("usage: %s [ ] ... \n"), Prog); -+ exit(EXIT_FAILURE); -+} -+ -+/* -+ * newgidmap - Set the gid_map for the specified process -+ */ -+int main(int argc, char **argv) -+{ -+ char proc_dir_name[PATH_MAX]; -+ char *target_str; -+ pid_t target, parent; -+ int proc_dir_fd; -+ int ranges; -+ struct map_range *mappings; -+ struct stat st; -+ struct passwd *pw; -+ int written; -+ -+ Prog = Basename (argv[0]); -+ -+ /* -+ * The valid syntax are -+ * newgidmap target_pid -+ */ -+ if (argc < 2) -+ usage(); -+ -+ /* Find the process that needs it's user namespace -+ * gid mapping set. -+ */ -+ target_str = argv[1]; -+ if (!get_pid(target_str, &target)) -+ usage(); -+ -+ written = snprintf(proc_dir_name, sizeof(proc_dir_name), "/proc/%u/", -+ target); -+ if ((written <= 0) || (written >= sizeof(proc_dir_name))) { -+ fprintf(stderr, "%s: snprintf of proc path failed: %s\n", -+ Prog, strerror(errno)); -+ } -+ -+ proc_dir_fd = open(proc_dir_name, O_DIRECTORY); -+ if (proc_dir_fd < 0) { -+ fprintf(stderr, _("%s: Could not open proc directory for target %u\n"), -+ Prog, target); -+ return EXIT_FAILURE; -+ } -+ -+ /* Who am i? */ -+ pw = get_my_pwent (); -+ if (NULL == pw) { -+ fprintf (stderr, -+ _("%s: Cannot determine your user name.\n"), -+ Prog); -+ SYSLOG ((LOG_WARN, "Cannot determine the user name of the caller (UID %lu)", -+ (unsigned long) getuid ())); -+ return EXIT_FAILURE; -+ } -+ -+ /* Get the effective uid and effective gid of the target process */ -+ if (fstat(proc_dir_fd, &st) < 0) { -+ fprintf(stderr, _("%s: Could not stat directory for target %u\n"), -+ Prog, target); -+ return EXIT_FAILURE; -+ } -+ -+ /* Verify real user and real group matches the password entry -+ * and the effective user and group of the program whose -+ * mappings we have been asked to set. -+ */ -+ if ((getuid() != pw->pw_uid) || -+ (getgid() != pw->pw_gid) || -+ (pw->pw_uid != st.st_uid) || -+ (pw->pw_gid != st.st_gid)) { -+ fprintf(stderr, _( "%s: Target %u is owned by a different user\n" ), -+ Prog, target); -+ return EXIT_FAILURE; -+ } -+ -+ if (!sub_gid_open(O_RDONLY)) { -+ return EXIT_FAILURE; -+ } -+ -+ ranges = ((argc - 2) + 2) / 3; -+ mappings = get_map_ranges(ranges, argc - 2, argv + 2); -+ if (!mappings) -+ usage(); -+ -+ verify_ranges(pw, ranges, mappings); -+ -+ write_mapping(proc_dir_fd, ranges, mappings, "gid_map"); -+ sub_gid_close(); -+ -+ return EXIT_SUCCESS; -+} -Index: shadow/src/newuidmap.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ shadow/src/newuidmap.c 2013-02-01 15:27:53.832080342 -0600 -@@ -0,0 +1,183 @@ -+/* -+ * Copyright (c) 2013 Eric Biederman -+ * 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "defines.h" -+#include "prototypes.h" -+#include "subordinateio.h" -+#include "idmapping.h" -+ -+/* -+ * Global variables -+ */ -+const char *Prog; -+ -+static bool verify_range(struct passwd *pw, struct map_range *range) -+{ -+ /* An empty range is invalid */ -+ if (range->count == 0) -+ return false; -+ -+ /* Test /etc/subuid */ -+ if (have_sub_uids(pw->pw_name, range->lower, range->count)) -+ return true; -+ -+ /* Allow a process to map it's own uid */ -+ if ((range->count == 1) && (pw->pw_uid == range->lower)) -+ return true; -+ -+ return false; -+} -+ -+static void verify_ranges(struct passwd *pw, int ranges, -+ struct map_range *mappings) -+{ -+ struct map_range *mapping; -+ int idx; -+ -+ mapping = mappings; -+ for (idx = 0; idx < ranges; idx++, mapping++) { -+ if (!verify_range(pw, mapping)) { -+ fprintf(stderr, _( "%s: uid range [%lu-%lu) -> [%lu-%lu) not allowed\n"), -+ Prog, -+ mapping->upper, -+ mapping->upper + mapping->count, -+ mapping->lower, -+ mapping->lower + mapping->count); -+ exit(EXIT_FAILURE); -+ } -+ } -+} -+ -+void usage(void) -+{ -+ fprintf(stderr, _("usage: %s [ ] ... \n"), Prog); -+ exit(EXIT_FAILURE); -+} -+ -+/* -+ * newuidmap - Set the uid_map for the specified process -+ */ -+int main(int argc, char **argv) -+{ -+ char proc_dir_name[PATH_MAX]; -+ char *target_str; -+ pid_t target, parent; -+ int proc_dir_fd; -+ int ranges; -+ struct map_range *mappings; -+ struct stat st; -+ struct passwd *pw; -+ int written; -+ -+ Prog = Basename (argv[0]); -+ -+ /* -+ * The valid syntax are -+ * newuidmap target_pid -+ */ -+ if (argc < 2) -+ usage(); -+ -+ /* Find the process that needs it's user namespace -+ * uid mapping set. -+ */ -+ target_str = argv[1]; -+ if (!get_pid(target_str, &target)) -+ usage(); -+ -+ written = snprintf(proc_dir_name, sizeof(proc_dir_name), "/proc/%u/", -+ target); -+ if ((written <= 0) || (written >= sizeof(proc_dir_name))) { -+ fprintf(stderr, "%s: snprintf of proc path failed: %s\n", -+ Prog, strerror(errno)); -+ } -+ -+ proc_dir_fd = open(proc_dir_name, O_DIRECTORY); -+ if (proc_dir_fd < 0) { -+ fprintf(stderr, _("%s: Could not open proc directory for target %u\n"), -+ Prog, target); -+ return EXIT_FAILURE; -+ } -+ -+ /* Who am i? */ -+ pw = get_my_pwent (); -+ if (NULL == pw) { -+ fprintf (stderr, -+ _("%s: Cannot determine your user name.\n"), -+ Prog); -+ SYSLOG ((LOG_WARN, "Cannot determine the user name of the caller (UID %lu)", -+ (unsigned long) getuid ())); -+ return EXIT_FAILURE; -+ } -+ -+ /* Get the effective uid and effective gid of the target process */ -+ if (fstat(proc_dir_fd, &st) < 0) { -+ fprintf(stderr, _("%s: Could not stat directory for target %u\n"), -+ Prog, target); -+ return EXIT_FAILURE; -+ } -+ -+ /* Verify real user and real group matches the password entry -+ * and the effective user and group of the program whose -+ * mappings we have been asked to set. -+ */ -+ if ((getuid() != pw->pw_uid) || -+ (getgid() != pw->pw_gid) || -+ (pw->pw_uid != st.st_uid) || -+ (pw->pw_gid != st.st_gid)) { -+ fprintf(stderr, _( "%s: Target %u is owned by a different user\n" ), -+ Prog, target); -+ return EXIT_FAILURE; -+ } -+ -+ if (!sub_uid_open(O_RDONLY)) { -+ return EXIT_FAILURE; -+ } -+ -+ ranges = ((argc - 2) + 2) / 3; -+ mappings = get_map_ranges(ranges, argc - 2, argv + 2); -+ if (!mappings) -+ usage(); -+ -+ verify_ranges(pw, ranges, mappings); -+ -+ write_mapping(proc_dir_fd, ranges, mappings, "uid_map"); -+ sub_uid_close(); -+ -+ return EXIT_SUCCESS; -+} diff --git a/debian/patches/userns/12_userns_selinuxlibs b/debian/patches/userns/12_userns_selinuxlibs deleted file mode 100644 index 71833c41..00000000 --- a/debian/patches/userns/12_userns_selinuxlibs +++ /dev/null @@ -1,13 +0,0 @@ -Index: shadow-4.1.5.1/src/Makefile.am -=================================================================== ---- shadow-4.1.5.1.orig/src/Makefile.am 2013-02-04 11:56:40.485335430 -0600 -+++ shadow-4.1.5.1/src/Makefile.am 2013-02-04 11:57:49.525334261 -0600 -@@ -80,6 +80,8 @@ - endif - - chage_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) -+newuidmap_LDADD = $(LDADD) $(LIBSELINUX) -+newgidmap_LDADD = $(LDADD) $(LIBSELINUX) - chfn_LDADD = $(LDADD) $(LIBPAM) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD) - chgpasswd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBSELINUX) $(LIBCRYPT) - chsh_LDADD = $(LDADD) $(LIBPAM) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD) diff --git a/debian/patches/userns/13_subordinate_parse_static_buf b/debian/patches/userns/13_subordinate_parse_static_buf deleted file mode 100644 index 7c9eb3a9..00000000 --- a/debian/patches/userns/13_subordinate_parse_static_buf +++ /dev/null @@ -1,23 +0,0 @@ -Description: subordinateio: Fix subordinate_parse to have an internal static buffer - subordinate_parse is supposed to return a static structure that - represents one line in /etc/subuid or /etc/subgid. I goofed and - failed to make the variable rangebuf that holds the username of - in the returned structure static. - . - Add this missing static specification. -Author: -Origin: upstream -Forwarded: no -Index: shadow-4.1.5.1/lib/subordinateio.c -=================================================================== ---- shadow-4.1.5.1.orig/lib/subordinateio.c 2013-02-04 11:56:40.265335433 -0600 -+++ shadow-4.1.5.1/lib/subordinateio.c 2013-02-04 12:32:46.653298752 -0600 -@@ -48,7 +48,7 @@ - static void *subordinate_parse (const char *line) - { - static struct subordinate_range range; -- char rangebuf[1024]; -+ static char rangebuf[1024]; - int i; - char *cp; - char *fields[NFIELDS]; diff --git a/debian/patches/userns/14_fix_getopt b/debian/patches/userns/14_fix_getopt deleted file mode 100644 index 988e9d0a..00000000 --- a/debian/patches/userns/14_fix_getopt +++ /dev/null @@ -1,24 +0,0 @@ -Index: shadow-userns/src/usermod.c -=================================================================== ---- shadow-userns.orig/src/usermod.c 2013-02-05 16:35:10.608485591 +0000 -+++ shadow-userns/src/usermod.c 2013-02-05 17:16:20.540485591 +0000 -@@ -993,9 +993,9 @@ - }; - while ((c = getopt_long (argc, argv, - #ifdef WITH_SELINUX -- "ac:d:e:f:g:G:hl:Lmop:R:s:u:UZ:", -+ "ac:d:e:f:g:G:hl:Lmop:R:s:u:UZ:v:w:V:W:", - #else /* !WITH_SELINUX */ -- "ac:d:e:f:g:G:hl:Lmop:R:s:u:U", -+ "ac:d:e:f:g:G:hl:Lmop:R:s:u:Uv:w:V:W:", - #endif /* !WITH_SELINUX */ - long_options, NULL)) != -1) { - switch (c) { -@@ -1141,6 +1141,7 @@ - exit(E_BAD_ARG); - } - wflg = true; -+ break; - case 'W': - if (prepend_range (optarg, &del_sub_gids) == 0) { - fprintf (stderr, diff --git a/debian/patches/userns/16_add-argument-sanity-checking.patch b/debian/patches/userns/16_add-argument-sanity-checking.patch deleted file mode 100644 index d2f35159..00000000 --- a/debian/patches/userns/16_add-argument-sanity-checking.patch +++ /dev/null @@ -1,80 +0,0 @@ -From df3c8c1f7f47ceff607595067458f1d8e53eaab8 Mon Sep 17 00:00:00 2001 -From: Serge Hallyn -Date: Fri, 21 Jun 2013 11:47:36 -0500 -Subject: [PATCH 1/1] userns: add argument sanity checking - -In find_new_sub_{u,g}ids, check for min, count and max values. - -In idmapping.c:get_map_ranges(), make sure that the value passed -in for ranges did not overflow. Couldn't happen with the current -code, but this is a sanity check for any future potential mis-uses. - -Signed-off-by: Serge Hallyn ---- - libmisc/find_new_sub_gids.c | 8 ++++++++ - libmisc/find_new_sub_uids.c | 8 ++++++++ - libmisc/idmapping.c | 10 ++++++++++ - 3 files changed, 26 insertions(+) - -diff --git a/libmisc/find_new_sub_gids.c b/libmisc/find_new_sub_gids.c -index 68046ac..fd44978 100644 ---- a/libmisc/find_new_sub_gids.c -+++ b/libmisc/find_new_sub_gids.c -@@ -58,6 +58,14 @@ int find_new_sub_gids (const char *owner, - max = getdef_ulong ("SUB_GID_MAX", 600100000UL); - count = getdef_ulong ("SUB_GID_COUNT", 10000); - -+ if (min >= max || count >= max || (min + count) >= max) { -+ (void) fprintf (stderr, -+ _("%s: Invalid configuration: SUB_GID_MIN (%lu)," -+ " SUB_GID_MAX (%lu), SUB_GID_COUNT (%lu)\n"), -+ Prog, min, max, count); -+ return -1; -+ } -+ - /* Is there a preferred range that works? */ - if ((*range_count != 0) && - (*range_start >= min) && -diff --git a/libmisc/find_new_sub_uids.c b/libmisc/find_new_sub_uids.c -index f1720f9..b608c59 100644 ---- a/libmisc/find_new_sub_uids.c -+++ b/libmisc/find_new_sub_uids.c -@@ -58,6 +58,14 @@ int find_new_sub_uids (const char *owner, - max = getdef_ulong ("SUB_UID_MAX", 600100000UL); - count = getdef_ulong ("SUB_UID_COUNT", 10000); - -+ if (min >= max || count >= max || (min + count) >= max) { -+ (void) fprintf (stderr, -+ _("%s: Invalid configuration: SUB_UID_MIN (%lu)," -+ " SUB_UID_MAX (%lu), SUB_UID_COUNT (%lu)\n"), -+ Prog, min, max, count); -+ return -1; -+ } -+ - /* Is there a preferred range that works? */ - if ((*range_count != 0) && - (*range_start >= min) && -diff --git a/libmisc/idmapping.c b/libmisc/idmapping.c -index cb9e898..4147796 100644 ---- a/libmisc/idmapping.c -+++ b/libmisc/idmapping.c -@@ -41,6 +41,16 @@ struct map_range *get_map_ranges(int ranges, int argc, char **argv) - struct map_range *mappings, *mapping; - int idx, argidx; - -+ if (ranges < 0 || argc < 0) { -+ fprintf(stderr, "%s: error calculating number of arguments\n", Prog); -+ return NULL; -+ } -+ -+ if (ranges != ((argc - 2) + 2) / 3) { -+ fprintf(stderr, "%s: ranges: %u is wrong for argc: %d\n", Prog, ranges, argc); -+ return NULL; -+ } -+ - if ((ranges * 3) > argc) { - fprintf(stderr, "ranges: %u argc: %d\n", - ranges, argc); --- -1.8.1.2 - diff --git a/debian/patches/userns/manpagetypo b/debian/patches/userns/manpagetypo deleted file mode 100644 index 5c885851..00000000 --- a/debian/patches/userns/manpagetypo +++ /dev/null @@ -1,26 +0,0 @@ -Index: shadow/man/subgid.5.xml -=================================================================== ---- shadow.orig/man/subgid.5.xml 2013-03-06 15:19:23.848386200 -0600 -+++ shadow/man/subgid.5.xml 2013-03-06 15:19:51.240386816 -0600 -@@ -104,7 +104,7 @@ - subuid5 - , - -- logindefs5 -+ login.defs5 - , - - newuidmap1 -Index: shadow/man/subuid.5.xml -=================================================================== ---- shadow.orig/man/subuid.5.xml 2013-03-06 15:19:09.660385881 -0600 -+++ shadow/man/subuid.5.xml 2013-03-06 15:19:44.956386675 -0600 -@@ -104,7 +104,7 @@ - subgid5 - , - -- logindefs5 -+ login.defs5 - , - - newuidmap1